2010-06-30 18 views
29

Sto provando a compilare lo stesso file C su due macchine diverse con versioni diverse di cc.la dichiarazione statica segue la dichiarazione non statica

gcc version 3.2.3 dice warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc version 4.1.2 dice error: static declaration of 'foo' follows non-static declaration

AFAICT, entrambi hanno gli stessi CFLAGS. Mi piacerebbe fare in modo che gcc 4.1 si comporti come gcc 3.2.3, ovvero trovare un'opzione che trasformerebbe questo errore in un semplice avvertimento.

risposta

26

Da ciò che il messaggio di errore si lamenta, sembra che si dovrebbe piuttosto provare a correggere il codice sorgente. Il compilatore lamenta differenza di dichiarazione, simile a, per esempio

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

e questo non è valido codice C, quindi il compilatore si lamenta.

Forse il tuo problema è che non è disponibile un prototipo quando la funzione viene utilizzata la prima volta e il compilatore ne crea implicitamente uno che non sarà statico. In tal caso, la soluzione è aggiungere un prototipo da qualche parte prima che venga utilizzato per la prima volta.

+1

In effetti il ​​codice non prototipizza la funzione, quindi gcc assume una dichiarazione statica implicita. La risposta giusta è che non c'è alcuna opzione per disattivare questo errore. – Alsciende

+0

È possibile trasformare le dichiarazioni implicite in errori con '-Werror-implicit-function-declaration' (in gcc 3.4, comunque, non sono sicuro delle versioni successive). – detly

+0

L'ho fatto, ma l'errore è ancora vivo! pastebin.com/2mpnyMPj –

4

Prova -Wno-traditional.

Ma meglio, aggiungere le dichiarazioni per le funzioni statiche:

static void foo (void); 

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

static void foo() 
{ 
    // do sth 
} 
+7

'-Wno-tradizionale' non ha funzionato. – Alsciende

+0

L'ho fatto, ma l'errore è ancora vivo! http://pastebin.com/2mpnyMPj –

4

Mentre 3.2.3 gcc è stato più clemente della questione, gcc 4.1.2 sta mettendo in luce un problema potenzialmente grave per il collegamento del vostro programma in seguito . Piuttosto, cercando di sopprimere l'errore, dovresti fare in modo che la dichiarazione forward corrisponda alla dichiarazione della funzione.

Se si desidera che la funzione sia globalmente disponibile (come da dichiarazione diretta), non dichiararla successivamente come statica. Allo stesso modo, se è rientrato in ambito locale, rendere statica la dichiarazione di inoltro corrispondente.

0

Hai dichiarato una funzione come non statica in alcuni file e hai implementato come statico in un altro file o da qualche parte lo stesso file può causare anche questo problema. Ad esempio il seguente codice produrrà questo errore.

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 
} 

Se si rimuove la statica dall'implementazione, l'errore scompare come indicato di seguito.

Problemi correlati