Statische verklaring oplossen volgt niet-statische verklaring in GCC C-code?

Ik probeer hetzelfde C-bestand te compileren op twee verschillende machines met verschillende versies van CC.

GCC-versie 3.2.3 Zegt warning: 'foo' was declared implicitly 'extern' and later 'static'

GCC versie 4.1.2 zegt error: static declaration of 'foo' follows non-static declaration

beide hebben dezelfde CFLAG’s. Ik wil GCC 4.1.2 gedragen, zoals GCC 3.2.3, dat wil zeggen, zoek een optie die deze fout in slechts een waarschuwing zou draaien.


Antwoord 1, Autoriteit 100%

Vanaf waar het foutbericht over klaagt, klinkt het alsof je liever de broncode moet oplossen. De compiler klaagt over het verschil in de aangifte, vergelijkbaar met bijvoorbeeld

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

En dit is geen geldige C-code, vandaar dat de compiler klaagt.

Misschien is uw probleem dat er geen prototype beschikbaar is wanneer de functie de eerste keer wordt gebruikt en de compiler impliciet creëert dat er geen statisch zal zijn. Als dat zo is, is de oplossing om ergens een prototype toe te voegen voordat deze voor het eerst wordt gebruikt.


Antwoord 2, Autoriteit 39%

Ik heb dit probleem gehad in een geval waarin de static-functie is gebeld voordat deze werd verklaard. De functieverklaring naar overal boven de oproep verplaatsen die mijn probleem heeft opgelost.


Antwoord 3, Autoriteit 18%

Hoewel GCC 3.2.3 meer vergevingsgezind was van het probleem, is GCC 4.1.2 een potentieel serieus probleem opgelost voor de koppeling van uw programma later. In plaats daarvan probeert u de fout te onderdrukken, moet u de Forward-verklaring aansluiten bij de functieaangifte.

Als het je bedoeling was dat de functie globaal beschikbaar zou zijn (volgens de forward-declaratie), declareer deze dan niet als statisch. Evenzo, als het is ingesprongen om lokaal bereik te hebben, maak dan de voorwaartse declaratie statisch om overeen te komen.


Antwoord 4, autoriteit 15%

Probeer -Wno-traditional.

Maar beter, voeg verklaringen toe voor uw statische functies:

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

Antwoord 5, autoriteit 9%

Je hebt een functie in een bestand als niet-statisch gedeclareerd en je hebt een functie als statisch in een ander bestand geïmplementeerd of ergens in hetzelfde bestand kan dit probleem ook veroorzaken.
De volgende code zal deze fout bijvoorbeeld produceren.

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
}

Als u de static uit de implementatie verwijdert, verdwijnt de fout zoals hieronder.

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

Antwoord 6, autoriteit 6%

Deze fout kan worden veroorzaakt door een niet-gesloten reeks haakjes.

int main {
  doSomething {}
  doSomething else {
}

Niet zo gemakkelijk te herkennen, zelfs niet in dit voorbeeld van vier regels.

Deze fout, in een hoofdfunctie van 150 regels, veroorzaakte de verbijsterende fout: “statische declaratie van ‘savePair’ volgt niet-statische verklaring”. Er was niets mis met mijn definitie van de functie savePair, het was dat niet-gesloten haakje.


Antwoord 7

Ik had een soortgelijk probleem, de functienaam die ik gebruikte, kwam overeen met een van de ingebouwde functies die in een van de kopbestanden die ik in het programma waren opgenomen. Reading via het Compiler-foutmelding vertelt u het exacte koptekstbestand en de functie NAAM.CHANGEN VAN DE FUNCTIENAAM OPGESTELD DIT PROBLEEM VOOR ME

Other episodes