Téléchargement
illégal
Posez votre question Signaler

[C] Anomalie de fonction static [Résolu]

ekra 1889Messages postés 15 avril 2005Date d'inscription - Dernière réponse le 16 juin 2007 à 21:50
Bonjour,
Lorsque je définie des fonctions du type :
static int
static void
etc...
Le compilateur me renvoie des anomalie du type :
Warning in fonction ....... : type static declarated but never initializated (à peu près)
Ok si c'était une variable, mais pour une fonction, pourquoi me dit-il qu'il faut l'initialiser ?
Je précise que j'ai bien un .h contenant toutes les fonctions.
Merci d'avance.
PS : Il ne faut peut-être pas déclarer les fonctions static dans un .h ?
Lire la suite 

[C] Anomalie de fonction static »

16 réponses
Réponse
+5
moins plus
Je vois.

Il faut que tu considères une fonction statique comme une fonction privée. Une fonction qui n'appartient qu'à un fichier source.
Si une fonction statique est utilisée dans un fichier source, elle n'a pas lieu d'être protoypée dans un header commun à tout le monde.

Ton terrain.h est appelé juste par testterrain.c, il ne sert donc que d'interface pour utiliser les fonctions implémentées dans terrain.c. Et la fonction statique est déclarée dans terrain.h
Elle ne devrait être déclarée que dans le fichier qui implémente cette fonction statique ou encore dans un header qui n'est appelé que par le fichier qui implémente cette fonction.

Les autres fichiers sources n'ont pas lieu de connaître l'existence de cette fonction qu'ils n'utilisent pas.
Ajouter un commentaire
Réponse
+2
moins plus
Ben si je me gourre pas, en c, une fonction statique c'est une fonction dont la portée de dépasse pas le fichier source courant...

Donc totalement différent du c++ si je ne m'abuse.

PS : Il ne faut peut-être pas déclarer les fonctions static dans un .h ?

C'est pas logique, normalement le préprocesseur va prendre ton fichier.h pour le mettre dans le fichier.c
Pour le compilateur c'est comme si ça ne faisait qu'un seul fichier.

Je viens de faire le test:
//test.h

static int prout();

//test.c

#include "test.h"

static int prout(){return 1;}

Je compile:

gcc -c test.c

Et aucun problème....
Alors peut être que d'autres fichiers que celui qui implémente ta fonction statique font appel à ton fichier d'en-tête et se retrouvent perdus...
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

le langage est dans le titre (C)
La déclaration :
static int fonction(int peuImporte);
Le message d'erreur est celui-là, à un mot près.
Dans le .h :
Warning in fonction fonction() : fonction type static declarated but never initializated
Ajouter un commentaire
Réponse
-1
moins plus
Bonjour,

Il serait bon de connaître :
- le langage (static n'a pas le même sens en C et C++)
- la déclation complète de la fonction
- le message d'erreur exact.

Manu
Ajouter un commentaire
Réponse
-1
moins plus
Merci de vos réponses,

Je n'ai toujours pas trouvé, je vous passe un lien vers le projet

http://cjoint.com/?bwsAhoTdSv

(faire : $make test)

Merci.

PS : Alors peut être que d'autres fichiers que celui qui implémente ta fonction statique font appel à ton fichier d'en-tête et se retrouvent perdus...

Je crois bien que c'est ça...

Donc en général, lorque tu déclares des fonctions static, il fait créer deux .h ? Un qui contient les fonctions à porté globale et un autre qui contients que les static, de cette façon, elles ne seront pas inclus dans d'autres fichiers ?
Ajouter un commentaire
Réponse
-1
moins plus
bien vue Kilian!
sinon,il me semble que static a le même sens en C et en C++, mais différent dans ou en dehors d'une class.
Ajouter un commentaire
Réponse
-1
moins plus
Ok, merci Killian :)

Je pensais en fait que si on ne déclarait pas une fonctions static (par un prototype), on pourrait avoir des problèmes à la compilation du fichier selon l'ordre dans lequel on a placé les fonctions.
=> Cela ne peut-il pas arriver ?
Ajouter un commentaire
Réponse
-1
moins plus
à mon avis, il y a quelque chose qui t'échape.
un .h n'a rien de magique, c'est juste du texte copier puis coller dans un fichier source. Son intéret est de facilité l'écriture la lecture des fichiers sources, et d'éviter certaines erreur.
"static" permet de déclarer une fonction/une variable qui ne sera accesible que depuis le fichier source considérer. Il n'a pas d'autre role.
Le problème d'ordre des fonctions n'interviens que si tu défini tes fonctions en meme temps que tu les déclare ET que tu utilise une fonction pas encore déclarer. ex. :
int f1(double a){if(f2(a)<0)return 10; else return 20;}
int f2(double a){return int(2*a+3-a*a);}
il y aura une erreur dans le if, car le compilaeur n'a jamais entendu parler de f2.
En tout cas, static n'a rien à voir la dedans.
L'interet de static est que tu peux avoir une fonction f dans un fichier a.c qui calcul le carré d'une valeur et une fonction f (donc de meme nom) dans un fichier b.c qui calcul la racine caré d'un nombre, sans qu'il y ai une erreur de compilation lors de l'éedition de lien (erreur sans static : f est défini deux fois)
ekra- 24 janv. 2007 à 16:11
Bonjour, et tout d'abord merci de ta réponse.

En tout cas, static n'a rien à voir la dedans.

Si justement !

Imaginons j'ai un fichier "1.h" qui est inclu dans "1.c" et "2.c"
Dans "1.c" on a defini certaines fonctions statiques (ex static void statique())
Dans "1.h" on ne met pas la déclaration des fonctions statiques pour que "2.c" ne voit pas la déclaration de ces fonctions.

Le problème est que dans "1.c" seules les fonctions non statiques ont été déclaré avant d'êtres définie. Du coup une fonction non statique peut appeler une fonction statique (déclaré en même temps que la def) et qui est situé en dessous. Du coup le compîlateur ne l'a pas vu et génère une erreur.

D'où ma question, faut-il systematiquement déclarer les prototypes des fonctions statiques dans un autre fichier .h (ou directement au debut du code) ou il faut faire autre chose ?
Ajouter un commentaire
Réponse
-1
moins plus
Du coup une fonction non statique peut appeler une fonction statique
Houlà !! Relie bien, c'est vraiment pas logique. une fonction non static qui fait appel à une fonction static fait qu'en dehors de 1.c ta fonction non static est inutilisable. Ou alors, tu veux faire des choses vraiment tordus et à mon avis pas propres.
Pour ce qui est de déclaration dans les .h de fonctions static : si tu veux. Mais vu qu'elles n'ont pas de raisons d'être appeler dans un autre .c autant les mettre directement dans le source.
De plus il me semble que tu peux déclarer une fonction static séparemment de sa definition. Contrairement à ce que tu laisse penser :
... fonction statique (déclaré en même temps que la def)
ekra- 24 janv. 2007 à 17:13
Je vais mettre un exemple ce sera plus clair.

-----------------1.h------------------
int fonctionnormale(void);
---------------------------------------

-----------------1.c------------------
#include "1.h"

int fonctionnormale() {
   fonctionstatique();  /*  <========= Inconnue ! Déclarée plus bas*/
   return 0;
}

static int fonctionstatique() {
    printf("Bonjour\n");
    return 0;
}
----------------------------------------

-----------2.c----------------
#include "1.h"

/*Blabbalbalbalablabal*/
----------------------------

c'est vraiment pas logique. une fonction non static qui fait appel à une fonction static fait qu'en dehors de 1.c ta fonction non static est inutilisable

Je n'ai pas parlé de fonction statique appelé en dehors de son fichier mais il est vrai que je n'ai pas été clair.
Ajouter un commentaire
Réponse
-1
moins plus
En effet, ça fonctionne pas. Mais encore une fois que ta deuxième fonction soit static ou non ne change rien.
Tu n'a qu'a faire :
-----------------1.c------------------
#include "1.h"
static int fonctionstatique();
int fonctionnormale() {
   fonctionstatique();  /*  <========= plus  Inconnue ! */
   return 0;
}

static int fonctionstatique() {
    printf("Bonjour\n");
    return 0;
}
----------------------------------------

Mais je viens de m'apercevoir d'un truc que je sais pas.
si tu appel fonctionnormal ailleur que dans 1.c, cette fonction fesant référence à une fonction static, le programme tournerat-il ?
Mon problème se situe là en fait.
Ajouter un commentaire
Réponse
-1
moins plus
J'ai demandé à droite à gauche, il semblerait qu'on ne crée pas un header spécifique pour les fonctions statiques (ne sert a rien car n'est pas utilisé par plusieurs fichiers), mais on déclare les prototypes directement dans le code.

Ex :
-----------------1.h------------------
int fonctionnormale(void);
---------------------------------------

-----------------1.c------------------
#include "1.h"

static int fonctionstatique(); /* <== Déclaration dans le code */

int fonctionnormale() {
   fonctionstatique(); 
   return 0;
}

static int fonctionstatique() {
    printf("Bonjour\n");
    return 0;
}
----------------------------------------

-----------2.c----------------
#include "1.h"

/*Blabbalbalbalablabal*/
----------------------------
Ajouter un commentaire
Réponse
-1
moins plus
Ba oui, c'est ce que je disais au post <11>
Te prend pas la tête avec ces histoires de . h, ce ne sont que des convention, des recommandations. Elles peuvent être "transgresser" si le cas se présente comme étant plus logique.
ekra- 16 juin 2007 à 21:50
J'avais juste oublié de te remercier :)
Ajouter un commentaire
Réponse
-2
moins plus
Pour moi une fonction static en C ça n'a pas de sens. Une variable oui mais pas une fonction? D'un autre côté je fais plutôt du C++ alors je peux me tromper :p
Ajouter un commentaire
Ce document intitulé « [C] Anomalie de fonction static » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?