2009-08-05 22 views
8

Estoy intentando construir un pequeño código que funcione en múltiples plataformas y compiladores. Yo uso aserciones, la mayoría de las cuales pueden desactivarse, pero al compilar con PGI pgicpp usando -mp para compatibilidad con OpenMP, automáticamente usa la opción --no_exceptions: todas las partes de mi código con una instrucción "throw" generan un error fatal en el compilador. ("el soporte para el manejo de excepciones está deshabilitado")Detecta el compilador con #ifdef

¿Hay un macro define d que puedo probar para ocultar las declaraciones throw en PGI? Normalmente trabajo con gcc, que tiene GCC_VERSION y similares. No puedo encontrar ninguna documentación que describa estas macros en PGI.

+0

clang http://stackoverflow.com/questions/2658461/what-predefined-macro-can-i-use-to-detect-clang | VC http://stackoverflow.com/questions/15127522/how-to-ifdef-by-compilertype-gcc-or-vc –

Respuesta

12

Eche un vistazo al proyecto Pre-defined C/C++ Compiler Macros en Sourceforge.

El compilador de PGI tiene una macro __PGI.

Además, eche un vistazo a libnuwen's encabezado compiler.hh para una forma decente de 'normalizar' las macros de versiones de compilador.

+0

El segundo enlace está muerto :( –

4

Usted podría intentar esto para ver qué macros están predefinidos por el compilador:

pgcc -dM 

Tal vez que revelará una macro adecuada que puede utilizar.

+1

De hecho. La salida de eso se muestra en http://www.pgroup.com/support/tprs_70.htm, y hay __PGI (mencionado anteriormente), y __PGIC__, __PGIC_MINOR__, y __PGIC_PATCHLEVEL__, que dan las partes mayor, menor y de nivel de parche de el número de versión del compilador –

+0

Y está la alegría de que el analizador sintáctico tome dos guiones bajos y haga cosas entretenidas con ellos. 'PGI' tiene el prefijo doble de subrayado; los otros tres tienen prefijo y sufijo con ellos. –

0

¿Has mirado los encabezados de impulso? Suponiendo que sean compatibles con PGI, habrán encontrado una forma de detectarlo. Podrías usar eso. Comenzaría a buscar en algún lugar en boost/config.

Cuestiones relacionadas