2012-07-04 11 views
12

En este programa c¿Es estándar para #if suponer constantes simbólicas indefinidas como 0?

#include<stdio.h> 
int main() 
{ 

     #if UnDefinedSymbolicConstant==0 
       printf("UnDefinedSymbolicConstant is equal to 0\n "); 
     #else 
       printf("UnDefinedSymbolicConstant is not equal to 0\n"); 

     #endif 
     return 0; 
} 

UnDefinedSymbolicConstant no ha sido #define en cualquier lugar, aún se está asumiendo que como 0 y da la output on gcc-4.3.4 como:

UnDefinedSymbolicConstant is equal to 0 

así, ¿Este el comportamiento estándar o funciona así solo en gcc?

+0

Una buena manera de averiguar si algo es estándar o no es -std = c99 -pedantic. Esto debería deshabilitar todas las extensiones de gcc. Sin ellos, gcc se ajusta bastante bien al estándar. – Lundin

+2

¿Estás seguro de que '-std = c99 -pedantic' capta todas las construcciones no estándar? Parece que está destinado a, pero si no me equivoco, todavía echa de menos algunos. Básicamente, todo lo que puede confiar en '-std = c99' es evitar permitir cosas que entren en conflicto con el comportamiento especificado por las normas, pero no necesariamente le impide hacer cosas que no entran en conflicto pero que no están especificadas por el estandar. '-pedantic' tiene la intención de advertirte sobre esto último, pero no estoy seguro de que esté completo. –

Respuesta

13

Sí, esto se especifica por la norma en 6.10.1:

Después de que se han realizado todos los reemplazos debido a la expansión macro y el operador unario definida, todos los identificadores restantes (incluidos los léxico idéntica a palabras clave) son reemplazados con el PP-número 0

6

es el valor por defecto, pero es posible que al menos generar advertencias para este uso de la opción -Wundef a gcc.

`-Wundef ': avise siempre un identificador que es no se encuentra una macro en un` #if' Directiva, fuera de `definida'. Dichos identificadores son reemplazados por cero.

Cuestiones relacionadas