2012-03-10 12 views
5

Para el código de su compilador, es común ver a las directivas cpp como:C macros del preprocesador - definición vs. valor de la portabilidad y la práctica

#if defined (__GNUC__) && (__GNUC__ >= 4)

que es la prueba preprocesador Me suelen utilizar - no exclusivamente para __GNUC__, pero es un ejemplo común. Alternativamente,

#if (__GNUC__ >= 4)

parece satisfacer los mismos requisitos. ¿Hay problemas potenciales con este último? No solo con gcc, sino con cualquier preprocesador que cumpla con los estándares. ¿Se puede evaluar el LHS como un valor determinado, incluso si no está definido? ¿Hay algún escollo en el segundo enfoque que los abogados de idiomas conocen?

Respuesta

5

El preprocesador asume que las macros indefinidas tienen el valor 0 en las comparaciones, por lo que su simplificación es correcta en este caso. Si desea comparar una versión inferior a 4 en gcc, puede tener problemas, ya que se evaluaría como true con un <, incluso si no es gcc.

Creo que la razón para el uso de ambos es también una cuestión de comprensibilidad, si marca

#if defined(__GNUC__) && (__GNUC>=4) 

que es bastante obvio que estás no ya en un bloque con el código que sólo es para GCC, mientras la simplificación

#if (__GNUC__ >= 4) 

no lo hace obvio y se puede leer como una verificación de versión solo cuando ya se sabe que es gcc.

+0

Absolutamente de acuerdo en que la primera opción es mejor, ya que hace que la intención sea más obvia y no cuesta nada. También evita un posible "error" en el que se evalúan múltiples casos de compilación/plataforma. –

2

En el caso GNUC, cuando se está probando a la inversa, que va a hacer lo incorrecto:

#if (__GNUC__ < 4) 

Creo que éste va a ser verdad incluso si GNUC no está definido.

+1

+1, buen contraejemplo. –

Cuestiones relacionadas