2011-01-18 7 views
16

Hace un tiempo he descubierto una (más bien antiguo) C Compiler, que escanea las macros de esta manera (pseudo código):¿Las instrucciones del preprocesador deben estar al principio de una línea?

if line.startswith("#include") or line.startswith("#define"): 
    ... 

.. ¿Qué tipo de planteó la cuestión para mí, donde realmente se deben colocar las macros, al comienzo de una línea, así:

void stuff() 
{ 
#if defined(WIN32) || defined(_WIN32) 
    ... 
#else 
#if defined(__GNUC__) 
    ... 
#else 
    ... 
#endif 
#endif 
} 

O más bien como tal (ya que es la manera de hacerlo, para mejorar la legibilidad):

void stuff() 
{ 
    #if defined(WIN32) || defined(_WIN32) 
    ... 
    #else 
    # if defined(__GNUC__) 
    ... 
    # else 
    ... 
    # endif 
    #endif 
} 

¿Es la forma en que se sangra el código del preprocesador estandarizado, es decir, no importa cómo lo sangra, siempre funcionará de la misma manera?

+5

Me encanta el pseudocódigo: D. "Pseudocódigo" es un gran lenguaje. –

Respuesta

13

Algunos viejos compiladores de C requiere que la #define (por ejemplo) esté a nivel con la margen izquierdo:

#define FOO bar 

Otros compiladores de C requiere sólo que el # estar en el margen izquierdo, por lo que podía:

# define FOO bar 

Nueva compiladores C er tienden a aceptar la # después de espacios en blanco,:

#define FOO bar 

Si desea compatibilidad con dichos compiladores anteriores, al menos debe poner su # en la primera columna. Si la compatibilidad no importa, entonces depende de usted.

Por lo general, trato de no incrustar #ifdef bloques dentro de las funciones, por lo que la cuestión de si deben ser sangrados en su mayoría desaparece.

+0

Supongo que no tendría que preocuparme por el soporte para compiladores como ZetaC, que afortunadamente ya casi nunca se usan ;-) –

+0

"Si quieres compatibilidad con compiladores tan antiguos", entonces necesitarás averiguar dónde más ni siquiera implementan C89, mucho menos C99? –

+0

Estás hablando de compiladores ANSI K & R v1 allí. Así que olvídate de las declaraciones de funciones y las listas de parámetros. – MSalters

-3

No creo que el compilador "preocupa" si tiene espacios antes del preprocesado - debe ser el mismo ...

+3

No adivine ... –

2

No, no es necesario que estén al principio de la línea, pero solo pueden tener espacios en blanco (espacios, pestañas, ...) antes que ellos.

Normalmente se colocan al principio de la línea porque no están sujetos a los ámbitos que les interesan, ya que se preprocesan antes del código C real.

+0

El espacio en blanco está permitido después del '#', como en '# include ' –

+2

Sí, por supuesto. ¿Estoy diciendo lo opuesto? – peoro

13

de gcc C preprocessor documentation:

directivas de preprocesamiento son líneas en su programa que comienzan con #'. Whitespace is allowed before and after the #'.

+0

@Will: probablemente escribió este comentario antes de agregar la segunda oración a la cita :) – davka

-1

No importa. Véalo de esta manera, si el código no fue ideado y en 1 línea aún debe compilarse (solo el código, el preprocesador/incluye en algunas otras cosas necesita una línea separada).

Editar: parece ser que el compilador realmente viejo es exigente con esto. El preprocesador debe estar en una línea, al igual que otras cosas que no son de código, como

+1

Si el código no estaba sangrado, todo en una línea, no se compilaría: el preprocesador es sensible a la línea. –

+0

Se adhieren a C# .... –

+0

sí, se me olvidó esa parte. El preprocesador debe estar en 1 línea (sin nada más), pero para el código esto no importa. – RvdK

Cuestiones relacionadas