2009-08-05 2 views
8

Sto provando a creare un piccolo codice che funzioni su più piattaforme e compilatori. Uso asserzioni, la maggior parte delle quali possono essere disattivate, ma quando compili con pgicpp di PGI usando -mp per il supporto OpenMP, utilizza automaticamente l'opzione --no_exceptions: ovunque nel mio codice con un'istruzione "throw" genera un errore fatale del compilatore. ("il supporto per la gestione delle eccezioni è disabilitato")Rileva compilatore con #ifdef

Esiste una macro define d Posso verificare per nascondere le istruzioni throw su IGP? Di solito lavoro con gcc, che ha GCC_VERSION e simili. Non riesco a trovare alcuna documentazione che descriva queste macro in 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 –

risposta

12

Dai un'occhiata al progetto Pre-defined C/C++ Compiler Macros su Sourceforge.

Il compilatore di PGI ha una macro __PGI.

Inoltre, dare un'occhiata all'intestazione del compiler.hh libnuwen's per un modo decente di "normalizzare" macro di controllo delle versioni del compilatore.

+0

Secondo link è morto :( –

4

Si potrebbe provare questo per vedere che cosa le macro sono predefinite dal compilatore:

pgcc -dM 

Forse che rivelerà una macro adatto è possibile utilizzare.

+1

Infatti. L'output di questo è mostrato su http://www.pgroup.com/support/tprs_70.htm, e ci sono __PGI (menzionato sopra) e __PGIC__, __PGIC_MINOR__ e __PGIC_PATCHLEVEL__, che forniscono le parti maggiore, minore e patchlevel di il numero di versione del compilatore. –

+0

E c'è la gioia del parser che prende i doppi underscore e fa cose divertenti con loro. 'PGI' è preceduto da caratteri di sottolineatura doppi; gli altri tre sono entrambi prefissati e suffissi con loro. –

0

Hai guardato le intestazioni boost? Supponendo che supportino l'IGP, avranno trovato un modo per rilevarlo. Potresti usarlo. Vorrei iniziare a cercare da qualche parte in boost/config.