2013-07-29 12 views
12

vedo questo messaggio di avviso quando si compila (gcc 4.6.3, ubuntu) l'esempio:C++ Attenzione: tipo anonimo, senza legame utilizzato per dichiarare variabile

struct { 
} a; 

int main() 
{ 
} 


warning: anonymous type with no linkage used to declare variable ‘<anonymous struct> a’ with linkage [enabled by default]. 

GCC non dà questo avvertimento. Lo fa solo G ++.

Aggiunta statico cancella l'avvertimento:

static struct { 
} a; 

non riuscivo a capire che cosa vuol dire, soprattutto perché è legato alla typelinkage. Ho pensato che il collegamento dipende da dove e come viene dichiarata una variabile, ma non dal tipo della variabile stessa.

+1

related ?? http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41970 – billz

+2

Se l'una o l'altra risposta ti hanno aiutato, dovresti accettare, ho notato che hai accettato solo una risposta, se non accetti risposte persone sarà meno probabile rispondere alle tue domande – aaronman

risposta

8

L'errore è perché si dichiara una variabile a che ha un tipo anonimo (nessun nome di tipo dopo struct). Suppongo che l'avviso sia perché non puoi dichiarare di nuovo una variabile di quel tipo (senza usare decltype). Presumo che lo g++ dia l'avviso e non gcc perché il C++ tende ad essere un linguaggio più rigoroso. L'ho anche testato con clang++ e clang e non producono alcun avviso anche con -Wall.

Suppongo che l'errore statico venga eliminato perché può essere utilizzato solo in quel file (ovvero senza collegamento esterno), sarebbe difficile utilizzare a in un file diverso perché non si conoscerà il tipo o avere accesso ai suoi membri.

MODIFICA: Sfortunatamente secondo lo link nell'avviso è in effetti un bug (comunque minore) ed è stato corretto.

+2

Presumibilmente in base al link @billz postato questo è in realtà un bug, vai alla figura – aaronman

12

Ciò significa che la variabile a dispone di un collegamento, ad esempio può essere visibile in altre unità di traduzione. Tuttavia, il suo tipo anonimo ha solo il collegamento interno (nessun collegamento [esterno]), quindi non è possibile accedere effettivamente alla variabile a in qualsiasi altra unità di traduzione poiché non è possibile accedere al suo tipo.

Fare in modo che la variabile statica gli fornisse il collegamento interno e quindi né il tipo né la variabile sarebbero visibili in altre unità di traduzione.

Non sono sicuro (nessun accesso al compilatore per verificare) se uno spazio dei nomi anonimo avrebbe lo stesso scopo in questo scenario.

+1

La mia risposta è simile, anche se la tua è meglio formulata, ma secondo un commento sull'OP è in realtà un bug, c'è un link – aaronman