2010-09-22 7 views
23

Questo codice non può essere compilato per me su gcc version 4.3.2 (Debian 4.3.2-1.1)è una parola chiave con restrizioni "unix" in C?

main(){ 
    int unix; 
} 

Ho controllato la lista delle parole chiave e C "unix" non è uno di loro. Perché ricevo il seguente errore?

unix.c:2: error: expected identifier or ‘(’ before numeric constant 

Chiunque?

risposta

24

unix non è un identificatore riservato dallo standard.

Se si compila con -std=c89 o -std=c99 il compilatore gcc accetterà il programma come previsto.

Dal manuale di gcc (https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html), l'enfasi è mia.

... Tuttavia, macro storicamente specifici del sistema hanno avuto nomi senza prefisso speciale; per esempio, è comune trovare unix definito su sistemi Unix. Per tutte le macro , GCC fornisce una macro parallela con due caratteri di sottolineatura aggiunti a all'inizio e alla fine. Se unix è definito come , verrà definito anche __unix__. Non ci saranno mai più di due sottotitoli ; il parallelo di _mips è __mips__.

2

Sono pronto a fare questo e suppongo che gcc sia efficacemente #definito come 1 su sistemi UNIX.

provare

main(){ 
    printf("%d", unix); 
} 

e vedere quello che si ottiene.

+0

Ha! Hai ragione: http://codepad.org/ML9VEsOa Stupid gcc. –

+1

@Steve: vedere la risposta di pmg per vedere perché 'gcc' in modalità non standard tende a definire questa macro. –

2

per rispondere alla tua domanda, no unix non è una parola riservata in C.

Tuttavia, il simbolo unix è probabilmente definito dal preprocessore o perché si include un file di intestazione o perché il compilatore definisce.

+0

È gcc che lo fa. –

+0

Va notato che è ** comportamento ** non conforme e non conforme per fare in modo che gcc lo faccia. –

11

eseguire il codice attraverso il preprocessore per scoprire ciò che il compilatore è in realtà vedendo:

gcc -E unix.c 

poi vedere se la variabile unix è conservato o trasformato dal preprocessore.

12

Unix è uno dei definisce il preprocessore usa in gcc per ottenere un elenco di defs utilizzare

gcc -dM -E -x c /dev/null 

(-dM dice gcc per debugdump le defs -E dice di stop dopo prepreocessing e -xc/dev/null gli dice di fingere/dev/null è un file ac)

+0

più corto e più facile: 'echo | gcc -E -dD -' – mirabilos

6

Non è una parola chiave.

È una macro predefinita per identificare il tipo di sistema. Sui sistemi Unix e Unix è definito come 1.

Per disattivare questa utilizzare l'opzione -ansi:

Nella modalità C, questo equivale a -std = C89. In modalità C++, è equivalente a -std = C++ 98. Disattiva alcune funzionalità di GCC che sono incompatibili con ISO C90 (durante la compilazione del codice C) o di standard C++ (durante la compilazione del codice C++), come le parole chiave "asm" e "typeof" e le macro predefinite come "unix" e "vax" che identificano il tipo di sistema che si sta utilizzando. Abilita anche la funzione di trigonofo ISO indesiderata e usata raramente. Per il compilatore C, disabilita il riconoscimento dei commenti // in stile C++ e la parola chiave "in linea".