[C] Anomalie de fonction static

Résolu/Fermé
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 - 21 janv. 2007 à 16:51
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 - 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 ?

13 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
22 janv. 2007 à 19:15
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.
5
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
22 janv. 2007 à 03:53
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...
2
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
21 janv. 2007 à 17:16
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
0
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
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
22 janv. 2007 à 18:28
Merci de vos réponses,

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

https://www.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 ?
-1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
22 janv. 2007 à 21:51
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.
-1
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
23 janv. 2007 à 18:12
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 ?
-1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 janv. 2007 à 11:23
à 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)
-1
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
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 ?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 janv. 2007 à 17:04
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)
-1
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
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.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 janv. 2007 à 08:37
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.
-1
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
25 janv. 2007 à 20:07
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*/
----------------------------
-1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 janv. 2007 à 09:37
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.
-1
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
16 juin 2007 à 21:50
J'avais juste oublié de te remercier :)
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
22 janv. 2007 à 00:50
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
-2