2010-09-22 23 views
23

Este código no compila para mí en versión de gcc 4.3.2 (Debian 4.3.2-1.1)es palabra clave restringida "unix" en C?

main(){ 
    int unix; 
} 

He revisado la lista de palabras clave y C "Unix" no es uno de ellos. ¿Por qué me sale el siguiente error?

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

Cualquiera?

Respuesta

24

unix no es un identificador reservado por el estándar.

Si compila con -std=c89 o -std=c99 el compilador gcc aceptará el programa como esperaba.

De gcc manual (https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html), el énfasis es mío.

... Sin embargo, macros históricamente específicas del sistema han tenido nombres sin prefijo especial; por ejemplo, es común encontrar unix definido en los sistemas Unix. Para todas las macros , GCC proporciona una macro paralela con dos guiones bajos añadidos en al principio y al final. Si unix es definido, __unix__ también se definirá. Nunca habrá más de dos caracteres de subrayado ; el paralelo de _mips es __mips__.

2

Estoy prendado de esto y supongo que gcc efectivamente # definió Unix como 1 en sistemas UNIX.

tratar

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

y ver lo que hay.

+0

¡Ja! Tienes razón: http://codepad.org/ML9VEsOa Stupid gcc. –

+1

@Steve: vea la respuesta de pmg para ver por qué 'gcc' en modo no estándar tiende a definir esta macro. –

2

Para responder a su pregunta, no unix no es una palabra reservada en C

Sin embargo, el símbolo unix es más probable que se define por el preprocesador, ya sea porque se incluye un archivo de cabecera o porque el compilador define.

+0

Es gcc que lo hace. –

+0

Debe tenerse en cuenta que está ** roto ** y el comportamiento no conforme para que gcc haga esto. –

11

ejecutar el código a través del preprocesador para averiguar lo que el compilador está viendo en realidad:

gcc -E unix.c 

luego ver si se conserva o su convertidos por el preprocesador variables unix.

12

UNIX es una de las define el preprocesador utiliza en gcc para obtener una lista de defs utilizar

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

(-dM dice gcc para debugdump los defs -E le indica que debe detener después del prepreoceso y -xc/dev/null le dice que finja/dev/null es el archivo ac)

+0

más corto y más fácil: 'echo | gcc -E -dD -' – mirabilos

6

No es una palabra clave.

Es una macro predefinida para identificar el tipo de sistema. En los sistemas tipo Unix y Unix, se define como 1.

para deshabilitar este utilice la opción -ansi:

En el modo C, esto es equivalente a -std = c89. En el modo C++, es equivalente a -std = C++ 98. Esto desactiva ciertas características de GCC que son incompatibles con ISO C90 (al compilar código C), o de C++ estándar (al compilar código C++), como las palabras clave "asm" y "typeof", y macros predefinidas como "unix" y "vax" que identifican el tipo de sistema que está utilizando. También habilita la función de trigraph ISO indeseable y rara vez utilizada. Para el compilador de C, deshabilita el reconocimiento de estilo C++ // comentarios, así como la palabra clave "en línea".