Comment résoudre une déclaration statique suit une déclaration non statique en code C GCC?

J’essaie de comstackr le même fichier C sur deux machines différentes avec des versions différentes de cc.

La version 3.2.3 de gcc dit un warning: 'foo' was declared implicitly 'extern' and later 'static'

La version 4.1.2 de gcc indique une error: static declaration of 'foo' follows non-static declaration

Les deux ont les mêmes CFLAGS. J’aimerais que gcc 4.1.2 se comporte comme gcc 3.2.3, c’est-à-dire trouve une option qui transformerait cette erreur en un simple avertissement.

De ce dont le message d’erreur se plaint, il semble que vous devriez plutôt essayer de réparer le code source. Le compilateur se plaint de différences dans les déclarations, comme par exemple

 void foo(int i); ... void foo(double d) { ... } 

et ce n’est pas un code C valide, par conséquent le compilateur se plaint.

Peut-être que votre problème est qu’il n’ya pas de prototype disponible lorsque la fonction est utilisée pour la première fois et que le compilateur en crée implicitement un qui ne sera pas statique. Si tel est le cas, la solution consiste à append un prototype quelque part avant sa première utilisation.

Essayez -Wno-traditional .

Mais mieux, ajoutez des déclarations pour vos fonctions statiques:

 static void foo (void); // ... somewhere in code foo (); static void foo () { // do sth } 

Bien que gcc 3.2.3 pardonne davantage le problème, celui-ci met en évidence un problème potentiellement sérieux pour la liaison de votre programme ultérieurement. Plutôt que d’essayer de supprimer l’erreur, vous devez faire correspondre la déclaration forward à la déclaration de fonction.

Si vous souhaitiez que la fonction soit disponible globalement (selon la déclaration forward), ne la déclarez pas ensuite comme statique. De même, s’il est mis en retrait pour être étendu localement, associez la déclaration forward à un état statique.

J’ai eu ce problème dans un cas où la fonction static été appelée avant sa déclaration. Déplacer la déclaration de fonction n’importe où au-dessus de l’appel a résolu mon problème.

Vous avez déclaré une fonction non statique dans un fichier et implémenté en statique dans un autre fichier ou quelque part dans le même fichier peut également provoquer ce problème. Par exemple, le code suivant produira cette erreur.

 void inlet_update_my_ratio(object_t *myobject); //some where the implementation is like this static void inlet_update_my_ratio(object_t *myobject) { //code } 

Si vous supprimez la statique de l’implémentation, l’erreur disparaîtra comme ci-dessous.

  void inlet_update_my_ratio(object_t *myobject) { //code } 

Cette erreur peut être provoquée par un jeu de crochets non fermé.

 int main { doSomething {} doSomething else { } 

Pas facile à repérer, même dans cet exemple à 4 lignes.

Cette erreur, dans une fonction principale de 150 lignes, a provoqué l’erreur déroutante: “la déclaration statique de ‘savePair’ suit une déclaration non statique”. Il n’y avait rien de mal avec ma définition de la fonction savePair, c’était cette parenthèse non fermée.