¿Los bloques de código entre #if 0 y #endif deben tener comillas dobles emparejadas?

int main(void) { #if 0 something" #endif return 0; } 

Un progtwig simple de arriba genera una advertencia: missing terminating " character en gcc. Esto parece extraño, porque significa que el comstackdor permite que los bloques de código entre #if 0 y endif tengan una statement no válida como something aquí, pero no comillas dobles " que no ‘ t par Lo mismo ocurre con el uso de #ifdef y #ifndef .

Los comentarios reales están bien aquí:

 int main(void) { /* something" */ return 0; } 

¿Por qué? Y la comilla simple ' comporta de manera similar, ¿hay alguna otra ficha que se trate de manera especial?

Vea las preguntas frecuentes de comp.Lang.c, 11.19 :

Bajo ANSI C, el texto dentro de un #if, #ifdef o #ifndef “desactivado” aún debe constar de “tokens de preprocesamiento válidos”. Esto significa que los caracteres “y ‘deben estar emparejados como en el código C real, y los pares no deben cruzar los límites de las líneas.

La comstackción debe pasar por muchos ciclos, antes de generar binarios ejecutables.

Aún no estás en el comstackdor. Su preprocesador está marcando este error. Esto no comprobará la syntax del lenguaje C, pero faltan comillas, llaves y cosas por el estilo que son errores del preprocesador.

Después de este pase de preprocesador, su código irá al comstackdor de C que detectará el error que está esperando …

El preprocesador funciona en el nivel de token y un literal de cadena se considera un token único. El preprocesador le advierte que tiene un token no válido.

De acuerdo con el estándar C99, una ficha de preprocesamiento es una de estas cosas:

  • nombre del encabezado
  • identificador
  • número de pp
  • carácter constante
  • cadena literal
  • puntuador
  • cada carácter que no sea espacio en blanco que no pueda ser uno de los anteriores

El estándar también dice:

Si un carácter ‘o’ coincide con la última categoría, el comportamiento no está definido.

Cosas como la “statement” anterior no son válidas para el comstackdor de C, pero es un token válido, y el preprocesador elimina este token antes de que llegue al comstackdor.

Junto a la respuesta de Kevin, Incompatibilities of GCC dice:

GCC se queja de constantes de caracteres no terminadas dentro de condicionales de preprocesamiento que fallan. Algunos progtwigs tienen comentarios en inglés encerrados en condicionales que están garantizados para fallar; Si estos comentarios contienen apóstrofes , GCC probablemente reportará un error. Por ejemplo, este código produciría un error:

 #if 0 You can't expect this to work. #endif 

La mejor solución para este problema es colocar el texto en un comentario de C real delimitado por /*...*/ .