2009-12-06 19 views
8

Tengo curiosidad de por qué veo casi todas las macros C formateados como esto:C macro/# define indentación?

#ifndef FOO 
# define FOO 
#endif 

O esto:

#ifndef FOO 
#define FOO 
#endif 

Pero no esto:

#ifndef FOO 
    #define FOO 
#endif 

(además, El operador de = de vim solo parece contar los dos primeros como correctos.)

¿Esto se debe a problemas de portabilidad entre los compiladores, o es solo una práctica estándar?

Respuesta

4

IIRC, los preprocesadores anteriores de C requerían el # para ser el primer caracter en la línea (aunque nunca he encontrado uno que tuviera este requisito).

Nunca he visto su código como su primer ejemplo. Por lo general, escribí directivas de preprocesador como en su segundo ejemplo. Descubrí que interfería visualmente con la sangría del código real menos (no es que escriba en C más).

El GNU C Preprocessor manual dice:

directivas de preprocesamiento son líneas en su programa que comienzan con '#'. El espacio en blanco está permitido antes y después de el '#'.

+0

Y existe la irritación adicional (como el OP mencionado en la pregunta) de que los editores a menudo tienen su propia idea de cómo los bloques condicionales del preprocesador deben ser (o no) sangrados. –

+1

El viejo compilador VAX C (circa 1986) arrojaría un error si una directiva de preprocesador no tuviera el '#' en la primera columna. –

7

que he visto hacer las tres formas, parece ser una cuestión de estilo, no de sintaxis

casos

Aunque por lo general el segundo ejemplo es el más común, que he visto donde la primera (o tercero) se usa para ayudar a distinguir varios niveles de #ifdefs. A veces, la lógica se puede anidar profundamente y la única forma de entenderla de un vistazo es usar una sangría de manera similar a como es práctica común sangrar bloques de código entre {y}.

1

Las directivas de preprocesador son líneas incluidas en nuestros programas que no son realmente declaraciones de programa sino directivas para el preprocesador. Estas líneas siempre van precedidas de un signo de almohadilla (#). El espacio en blanco está permitido antes y después del '#'. Tan pronto como se encuentre un carácter de nueva línea, se considera que la directiva del preprocesador finaliza.

No hay otra regla en cuanto al estándar de C/C++ en cuestión, así que sigue siendo cuestión de estilo y legibilidad, he visto/escrito programas solo en la segunda forma en que publicaste, aunque el tercero parece más legible

3

Prefiero utilizar el tercer estilo, con la excepción de incluir guardias, para las cuales utilizo el segundo estilo.

no me gusta el primer estilo en absoluto - pienso en #define como una instrucción de preprocesador, a pesar de que en realidad, por supuesto, no lo es, se trata de un # seguido por la instrucción de preprocesador define. Pero dado que lo pienso de esa manera, parece incorrecto separarlos. Espero editores de texto escritos por personas que aboguen por que el estilo tenga una sangría/falta de sangría que funcione con un código escrito con ese estilo. Pero odiaría encontrarlo usando un editor de texto que no lo hizo.

No tiene sentido complacer a los preprocesadores antiguos donde # debe ser el primer carácter de la línea, a menos que también pueda enumerar todas las demás diferencias entre esas implementaciones y C estándar, para evitar las otras cosas que podrías hacer que no apoyarían. Por supuesto, si realmente estás trabajando con un compilador preestablecido, es suficiente.