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

Lesezeit: 4 Minuten

Benutzeravatar von Alsciende
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.

Benutzeravatar von RotatingWheel
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.

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

  • 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

Boffins Benutzeravatar
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

Benutzeravatar von Nnaik
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

1409920cookie-checkWie löst man die statische Deklaration folgt der nicht statischen Deklaration im GCC-C-Code?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy