2011-09-22 17 views
12

Tengo algún código heredado que necesita pasar ciertas banderas gcc. ¿Puedo agregar verificaciones de pre-procesador para estos indicadores?compilación fallida si no se encuentran indicadores necesarios

Por ejemplo, digamos que necesito -fno-strict-aliasing, puedo hacer algo como esto:

#ifndef _FNO_STRICT_ALIASING 
    #error -fno-strict-aliasing is required! 
#endif 
+0

suena como algo que debería ser capaz de hacer. –

+0

@Code Monkey: Por supuesto, la bandera se puede pasar a través de make. Pero si el código fuente se mueve a un nuevo sistema make, ese conocimiento puede perderse (por ejemplo, si está distribuyendo el código fuente a una lib). Quiero que el código mismo sepa lo que necesita. Es más seco de esa manera. :) – paleozogt

Respuesta

6

Usted puede utilizar

#pragma GCC optimize "no-strict-aliasing" 

para compilar el archivo con esa bandera (anulando lo que se especifica en la línea de comando). También puede utilizar

__attribute__((optimize("no-strict-aliasing"))) 

aplicar la bandera a una sola función dentro de un archivo de origen ...

+0

¡Ah! ¡Incluso mejor de lo que estaba pidiendo! – paleozogt

+0

Sería mejor arreglar el código que requiere esta bandera, por lo que es realmente válido C. –

+0

Oh no: el uso de pragma con no-strict-aliasing no funciona: https://bugzilla.redhat.com/ show_bug.cgi? id = 486176 – paleozogt

3

Definitivamente no hay #define para que, al menos en mi versión de GCC.

Para ver todos los símbolos del preprocesador predefinidos:

g++ -dM -E - < /dev/null 

no creo que hay alguna manera de probar estas opciones. Sin embargo, si está utilizando GCC 4.4 o posterior, puede usar "optimize" function attribute o "optimize" #pragma para habilitar opciones específicas por función o por archivo.

Por ejemplo, si se agrega a un archivo de cabecera común:

#if defined(__GNUC__) 
#pragma GCC optimize ("no-strict-aliasing") 
#else 
#error "You are not using GCC" 
#endif 

... debe habilitar la opción para cada archivo que incluye la cabecera.

[Actualización]

Aceptar lo que me llevó unos 10 minutos demasiado largos para componer esta respuesta. Voy a dejarlo aquí de todos modos por los enlaces a los documentos de GCC.

+1

Oh no: el uso de pragma con no-strict-aliasing no funciona: https://bugzilla.redhat.com/show_bug.cgi ? id = 486176 – paleozogt

Cuestiones relacionadas