web-dev-qa-db-de.com

Wie löst man die statische Deklaration nach der nicht statischen Deklaration im GCC C-Code?

Ich versuche, dieselbe C-Datei auf zwei verschiedenen Computern mit unterschiedlichen Versionen von cc zu kompilieren.

gcc Version 3.2.3 sagt warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc Version 4.1.2 sagt error: static declaration of 'foo' follows non-static declaration

Beide haben die gleichen CFLAGS. Ich möchte, dass sich gcc 4.1.2 wie gcc 3.2.3 verhält, dh, eine Option finden, die diesen Fehler in eine bloße Warnung umwandelt.

34
Alsciende

Nach dem, was die Fehlermeldung beanstandet, klingt es so, als ob Sie lieber versuchen sollten, den Quellcode zu korrigieren. Der Compiler beschwert sich über Unterschiede in der Deklaration, ähnlich wie zum Beispiel

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

und dies ist kein gültiger C-Code, daher beschwert sich der Compiler.

Möglicherweise besteht Ihr Problem darin, dass bei der ersten Verwendung der Funktion kein Prototyp verfügbar ist und der Compiler implizit einen erstellt, der nicht statisch ist. In diesem Fall besteht die Lösung darin, irgendwo einen Prototypen hinzuzufügen, bevor er zum ersten Mal verwendet wird.

29
hlovdal

Während gcc 3.2.3 das Problem eher verzeihte, weist gcc 4.1.2 auf ein potenziell schwerwiegendes Problem für die spätere Verknüpfung Ihres Programms hin. Anstatt den Fehler zu unterdrücken, sollten Sie die Vorwärtsdeklaration der Funktionsdeklaration anpassen.

Wenn Sie beabsichtigen, dass die Funktion global verfügbar ist (gemäß der Vorwärtsdeklaration), dann deklarieren Sie sie nicht als statisch. Wenn es für einen lokalen Bereich eingerückt ist, müssen Sie die Vorwärtsdeklaration als statisch definieren.

5
bjg

Versuchen Sie -Wno-traditional.

Fügen Sie jedoch Deklarationen für Ihre statischen Funktionen hinzu:

static void foo (void);

// ... somewhere in code
    foo ();

static void foo ()
{
    // do sth
}
4
el.pescado

Dieser Fehler kann durch nicht geschlossene Klammern verursacht werden.

int main {
  doSomething {}
  doSomething else {
}

Nicht so leicht zu erkennen, selbst in diesem 4-Zeilen-Beispiel. 

Dieser Fehler in einer 150-zeiligen Hauptfunktion hat den verwirrenden Fehler verursacht: "Die statische Deklaration von 'savePair' folgt der nicht statischen Deklaration". Bei meiner Definition der Funktion savePair war nichts falsch, es war diese nicht geschlossene Klammer.

1
Boffin

Ich hatte dieses Problem in einem Fall, in dem die Funktion static aufgerufen wurde, bevor sie deklariert wurde. Das Verschieben der Funktionsdeklaration an eine beliebige Stelle oberhalb des Aufrufs hat mein Problem gelöst.

1
raggot

Sie haben eine Funktion in einer Datei als nicht statisch deklariert und in einer anderen Datei als statisch implementiert, oder die gleiche Datei kann an einem anderen Ort dieses Problem verursachen. Zum Beispiel führt der folgende Code zu diesem Fehler.

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
}

Wenn Sie die Statik aus der Implementierung entfernen, wird der Fehler wie nachstehend beseitigt.

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