web-dev-qa-db-fra.com

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

J'essaie de compiler 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 warning: 'foo' was declared implicitly 'extern' and later 'static'

la version 4.1.2 de gcc dit 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.

34
Alsciende

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. Dans ce cas, la solution consiste à ajouter un prototype quelque part avant sa première utilisation.

29
hlovdal

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 en sorte que la déclaration forward corresponde à 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 à une déclaration statique.

5
bjg

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
}
4
el.pescado

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 ahurissante: "la déclaration statique de" savePair "suit une déclaration non statique". Il n’y avait rien de mal dans ma définition de la fonction savePair, c’était cette parenthèse non fermée.

1
Boffin

J'ai eu ce problème dans un cas où la fonction static a é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.

1
raggot

Vous avez déclaré une fonction non statique dans un fichier et implémenté en statique dans un autre fichier ou quelque part le même fichier peut également causer 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
    }
0
RotatingWheel