Une fonction statique a-t-elle besoin du mot-clé statique pour le prototype dans C?

Mon livre de programmation C dit que lorsque je veux créer une fonction statique, je dois placer le mot-clé statique devant la définition de la fonction. Il ne mentionne pas explicitement le prototype. En outre, les exemples n’utilisent pas de prototypes et placent simplement les fonctions statiques en haut du fichier (de sorte qu’elles n’aient pas besoin de prototypes).

Donc, une fonction statique a-t-elle besoin du mot-clé statique pour le prototype? Ou est-ce que je ne le mets que devant la définition?

Une déclaration de fonction (prototype ou même la définition) peut omettre le mot-clé static si elle vient après une autre déclaration de la même fonction avec static .

S’il existe une déclaration static d’une fonction, sa première déclaration doit être static .

Il est défini dans ISO / IEC 9899: 1999, 6.7.1:

Si la déclaration d’un identificateur de scope de fichier pour une fonction […] contient le spécificateur de classe de stockage static , l’identificateur a un lien interne.

[…]

Pour un identificateur déclaré avec le spécificateur de classe de stockage extern dans une scope dans laquelle une déclaration préalable de cet identifiant est visible, si la déclaration préalable spécifie une liaison interne ou externe, la liaison de l’identifiant à la déclaration ultérieure est la même que la liaison spécifié lors de la déclaration préalable.

[…]

Si la déclaration d’un identificateur pour une fonction n’a pas de spécificateur de classe de stockage, sa liaison est déterminée exactement comme si elle avait été déclarée avec le spécificateur de classe de stockage extern .

[…]

Si, au sein d’une unité de traduction, le même identifiant apparaît avec une liaison à la fois interne et externe, le comportement est indéfini.

Donc, par exemple, ceci est valide:

 static void foo(void); void foo(void); static void foo(void) { } 

Celui-là aussi:

 static void foo(void) { } void foo(void); static void bar(void); void bar(void) {} 

Mais ce code est incorrect:

 void foo(void); static void foo(void) { } 

Normalement, vous devriez avoir la static dans les prototypes (car ils viennent généralement en premier).

oui, oui, vous devez mettre la statique devant la déclaration.

tapez ceci dans ideone.com

 int add(); int main(){ printf("%d",add()); return 0; } static int add(){ return 1+1; } 

vous obtenez ce résultat: http://ideone.com/VzZCiE

maintenant tapez ceci

 static int add(); int main(){ printf("%d",add()); return 0; } static int add(){ return 1+1; } 

vous obtenez ceci: http://ideone.com/sz8HVR

boum