2012-12-31 10 views
8

GCC ha un'opzione, -fms-extensions, che consente l'impiego di elementi struct anonimi:È una cattiva idea usare le estensioni -fms di GCC?

struct a { 
    int x; 
} 

struct b { 
    int y; 
    struct a; 
} 

Questo consente l'accesso di un elemento x in struct b semplicemente utilizzando b.x. Questo è estremamente utile, ma sembrerebbe che sia un'estensione Microsoft emulata da GCC.

L'utilizzo di questa opzione renderà il mio codice meno portabile o è considerato "sicuro" da utilizzare?

+0

IMHO, non è così utile. Non tanto per rendere il codice dipendente da gcc. Quindi la risposta è sì. – Jack

risposta

13

Se siete alla ricerca di compatibilità, non è mai una buona idea per impostare le opzioni di compilazione lassisti, più rigoroso - il più portabile

4

è usato La bandiera -fms-extensions per "Accept alcuni costrutti non standard utilizzati in File di intestazione Microsoft. ". GCC è potente perché è stato creato per diversi standard, quindi non credo sia una cattiva idea utilizzarlo in circostanze appropriate.

+1

(A meno che, naturalmente, non si stia scrivendo un nuovo codice e si desideri scegliere un altro compilatore!) –

+1

È un'idea * orribile * usarlo se non * è assolutamente necessario * usarlo. L'opzione è lì se ne hai bisogno - niente di più. – paulsm4

6

Considerando che una funzionalità che sembra equivalente, denominata strutture anonime e unioni, è stata aggiunta a C nell'edizione 2011 dello standard (C11), direi che non è una cattiva idea utilizzare questa funzione. I compilatori MS lo supportano, i compilatori compatibili con GCC e "GNU C" lo supportano se richiesto, e i nuovi compilatori conformi allo standard moderno lo supportano.

+1

In questo caso, tuttavia, il modo _nitpicky_ di abilitare questo supporto in gcc sarebbe dire '-std = c11' o' -std = iso9899: 2011' (come per i documenti gcc, http://gcc.gnu.org /onlinedocs/gcc/Standards.html)- non con una bandiera del compilatore di valigie speciali. –

+0

Beh, sfortunatamente molte versioni precedenti di gcc non riconoscono '-std = c11' (perché non c'era * C11 * quando sono state rilasciate), ma accettano comunque strutture/unioni anonime come estensione. Quindi, se vuoi che il tuo software non dipenda da gcc molto recenti, dovresti assicurarti che sia facile compilare con i flag che lo fanno funzionare anche su quelli più vecchi. –

Problemi correlati