Wie löst man die statische Deklaration folgt der nicht statischen Deklaration im GCC-C-Code?
Lesezeit: 4 Minuten
Alsciende
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 gcc 4.1.2 dazu bringen, sich wie gcc 3.2.3 zu verhalten, das heißt, eine Option finden, die diesen Fehler in eine bloße Warnung umwandelt.
Nach dem, worüber sich die Fehlermeldung beschwert, klingt es so, als ob Sie lieber versuchen sollten, den Quellcode zu reparieren. 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. Wenn dies der Fall ist, besteht die Lösung darin, irgendwo einen Prototyp hinzuzufügen, bevor er zum ersten Mal verwendet wird.
Tatsächlich erstellt der Code keinen Prototyp der Funktion, daher geht gcc von einer impliziten statischen Deklaration aus. Die richtige Antwort ist, dass es keine Option gibt, diesen Fehler auszuschalten.
– Alsciende
1. Juli 2010 um 7:40 Uhr
Mit können Sie implizite Deklarationen in Fehler umwandeln -Werror-implicit-function-declaration (jedenfalls unter gcc 3.4; bei späteren Versionen bin ich mir nicht sicher).
– dezent
1. Juli 2010 um 7:55 Uhr
Ich habe es getan, aber Fehler noch am Leben! pastebin.com/2mpnyMPj
– Dr.jacky
1. Februar 2016 um 6:06 Uhr
Ich hatte dieses Problem in einem Fall, in dem die static Die Funktion wurde aufgerufen, bevor sie deklariert wurde. Das Verschieben der Funktionsdeklaration an eine beliebige Stelle über dem Aufruf löste mein Problem.
Versuchen -Wno-traditional.
Aber besser, fügen Sie Deklarationen für Ihre statischen Funktionen hinzu:
static void foo (void);
// ... somewhere in code
foo ();
static void foo ()
{
// do sth
}
Während gcc 3.2.3 das Problem besser versöhnte, hebt gcc 4.1.2 ein potenziell schwerwiegendes Problem für das spätere Verlinken Ihres Programms hervor. Anstatt zu versuchen, den Fehler zu unterdrücken, sollten Sie dafür sorgen, dass die Vorwärtsdeklaration mit der Funktionsdeklaration übereinstimmt.
Wenn Sie beabsichtigten, dass die Funktion global verfügbar ist (gemäß der Vorwärtsdeklaration), deklarieren Sie sie anschließend nicht als statisch. Wenn es für den lokalen Bereich eingerückt ist, machen Sie die Vorwärtsdeklaration entsprechend statisch.
Drehrad
Sie haben eine Funktion in einer Datei als nicht statisch deklariert und in einer anderen Datei oder irgendwo in derselben Datei als statisch implementiert, kann dieses Problem ebenfalls verursachen. Beispielsweise wird der folgende Code diesen Fehler erzeugen.
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 folgt verschwinden.
Dies war mein Fall (ich habe Ihre Antwort jetzt gesehen). Ich nehme also an, wenn wir zuerst die Deklaration und dann die Definition wie im ersten Beispielcode haben, nimmt der Compiler von der ersten Deklaration an, dass die Funktion eine nicht statische Funktion ist (die an anderer Stelle verwendet werden kann). Korrigiert mich jemand, wenn ich falsch liege.
– Chan-Kim
20. Mai 2021 um 8:29 Uhr
Boffin
Dieser Fehler kann durch eine nicht geschlossene Gruppe von Klammern verursacht werden.
int main {
doSomething {}
doSomething else {
}
Nicht so leicht zu erkennen, selbst in diesem Beispiel mit 4 Zeilen.
Dieser Fehler in einer Hauptfunktion mit 150 Zeilen verursachte den verwirrenden Fehler: “statische Deklaration von ‘savePair’ folgt nicht-statischer Deklaration”. An meiner Definition der Funktion savePair war nichts falsch, es war diese nicht geschlossene Klammer.
Dies war mein Fall (ich habe Ihre Antwort jetzt gesehen). Ich nehme also an, wenn wir zuerst die Deklaration und dann die Definition wie im ersten Beispielcode haben, nimmt der Compiler von der ersten Deklaration an, dass die Funktion eine nicht statische Funktion ist (die an anderer Stelle verwendet werden kann). Korrigiert mich jemand, wenn ich falsch liege.
– Chan-Kim
20. Mai 2021 um 8:29 Uhr
Nnaik
Ich hatte ein ähnliches Problem. Der von mir verwendete Funktionsname stimmte mit einer der eingebauten Funktionen überein, die in einer der Header-Dateien deklariert waren, die ich in das Programm aufgenommen hatte. Wenn Sie die Compiler-Fehlermeldung durchlesen, erfahren Sie die genaue Header-Datei und den Funktionsnamen Der Funktionsname hat dieses Problem für mich gelöst
Dies ist wirklich ein Kommentar, keine Antwort. Mit etwas mehr Repräsentanten können Sie Kommentare posten. Vielen Dank!
– Miroslav Glamuzina
3. März 2019 um 18:08 Uhr
14099200cookie-checkWie löst man die statische Deklaration folgt der nicht statischen Deklaration im GCC-C-Code?yes
Einige interessante Kommentare zum Quellcode am Fehlerpunkt: github.com/gcc-mirror/gcc/blob/gcc-8_1_0-release/gcc/c/…
– Ciro Santilli OurBigBook.com
25. Mai 2018 um 9:35 Uhr