2009-08-05 21 views
8

Próbuję utworzyć niewielki kod działający na wielu platformach i kompilatorach. Używam asercji, z których większość można wyłączyć, ale podczas kompilacji z PGI pgicpp przy użyciu -mp dla obsługi OpenMP, automatycznie korzysta z opcji --no_exceptions: wszędzie w moim kodzie z instrukcją "throw" generuje fatalny błąd kompilatora. ("obsługa obsługi wyjątków jest wyłączona")Wykryj kompilator z #ifdef

Czy istnieje define d makro Czy mogę przetestować, aby ukryć oświadczenia throw o PGI? Zwykle pracuję z gcc, który ma GCC_VERSION i tym podobne. Nie mogę znaleźć dokumentacji opisującej te makra w 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 –

Odpowiedz

12

Spójrz na projekt Pre-defined C/C++ Compiler Macros na Sourceforge.

Kompilator PGI ma makro __PGI.

Zobacz także libnuwen's nagłówek kompilatora.hh, aby uzyskać porządny sposób na "normalizację" makr kompilatora.

+0

Drugi link jest martwy :( –

4

można spróbować to aby zobaczyć co makra są predefiniowane przez kompilator:

pgcc -dM 

Może objawi odpowiedniego makra można użyć.

+1

Rzeczywiście. Dane wyjściowe tego są wyświetlane na stronie http://www.pgroup.com/support/tprs_70.htm, a także __PGI (wspomniano powyżej) i __PGIC__, __PGIC_MINOR__ i __PGIC_PATCHLEVEL__, które dają główne, drobne i poprawkowe części numer wersji kompilatora. –

+0

I jest radość, że parser bierze podwójne podkreślenia i robi z nimi zabawne rzeczy. "ChOG" jest poprzedzony podwójnymi podkreśleniami; pozostałe trzy są zarówno prefiksem, jak i sufiksem. –

0

Czy spojrzałeś na nagłówki doładowania? Zakładając, że wspierają one ChOG, znajdą sposób na jego wykrycie. Możesz tego użyć. Zacznę szukać gdzieś w boost/config.