Ermitteln Sie den Compiler mit #ifdef

8

Ich versuche, einen kleinen Code zu erstellen, der über mehrere Plattformen und Compiler hinweg funktioniert. Ich verwende Assertions, von denen die meisten deaktiviert werden können, aber beim Kompilieren mit PGI pgicpp mit -mp für die OpenMP-Unterstützung verwendet es automatisch die --no_exceptions -Option: überall in meinem Code mit einer "throw" -Anweisung erzeugt einen fatalen Compilerfehler ("Unterstützung für die Ausnahmebehandlung ist deaktiviert")

Gibt es ein Makro define d, das ich testen kann, um die throw -Anweisungen für PGI auszublenden? Ich arbeite normalerweise mit gcc, das GCC_VERSION und ähnliches hat. Ich kann keine Dokumentation finden, die diese Makros in PGI beschreibt.

    
Seth Johnson 05.08.2009, 13:58
quelle

3 Antworten

12

Sehen Sie sich das vordefinierte C / C ++ - Compiler-Makros -Projekt in Sourceforge an.

Der PGI Compiler hat ein __PGI Makro.

Sehen Sie sich auch libnuwen compiler.hh an, um einen ordentlichen Weg zu finden, Compiler-Versions-Makros zu "normalisieren".

    
Michael Burr 05.08.2009, 14:58
quelle
4
___ answer1233792 ___

Haben Sie sich die Boost-Header angeschaut? Angenommen, sie unterstützen PGI, haben sie einen Weg gefunden, es zu erkennen. Du könntest das benutzen. Ich würde irgendwo in %code% suchen.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ antwort1233485 ___

Sie können dies versuchen, um zu sehen, welche Makros vom Compiler vordefiniert sind:

%Vor%

Vielleicht enthüllt das ein geeignetes Makro, das Sie verwenden können.

    
___ qstnhdr ___ Ermitteln Sie den Compiler mit #ifdef ___ tag123exception ___ Eine Ausnahme ist eine ungewöhnliche Bedingung, die eine Abweichung vom normalen Ablauf des Programms erfordert. Normalerweise sollte eine Ausnahme nicht zu einem Totalausfall führen, sondern stattdessen von einem Ausnahmebehandler begleitet werden. Die Ausnahmebehandlung ist ein eingebautes Konstrukt in vielen Programmiersprachen. In der Regel werden Ausnahmen behandelt, indem der Stapel abgewickelt wird und somit in einen definierten Zustand außerhalb des Gültigkeitsbereichs der Ausnahme zurückversetzt wird und dann ein Verarbeitungsblock oder eine Routine aufgerufen wird. ___ qstntxt ___

Ich versuche, einen kleinen Code zu erstellen, der über mehrere Plattformen und Compiler hinweg funktioniert. Ich verwende Assertions, von denen die meisten deaktiviert werden können, aber beim Kompilieren mit PGI %code% mit %code% für die OpenMP-Unterstützung verwendet es automatisch die %code% -Option: überall in meinem Code mit einer "throw" -Anweisung erzeugt einen fatalen Compilerfehler ("Unterstützung für die Ausnahmebehandlung ist deaktiviert")

Gibt es ein Makro %code% d, das ich testen kann, um die %code% -Anweisungen für PGI auszublenden? Ich arbeite normalerweise mit gcc, das %code% und ähnliches hat. Ich kann keine Dokumentation finden, die diese Makros in PGI beschreibt.

    
___ tag123cpreprocessor ___ Der Makrovorverarbeitungsschritt der Programmiersprachen C und C ++. Dieser Tag kann auch für Fragen zu anderen Compilern / Sprachen verwendet werden, die von identischen Funktionen abgeleitet sind oder diese enthalten, wie z. B. die #Direktiven in Objective-C oder C #. ___ answer1233827 ___

Sehen Sie sich das vordefinierte C / C ++ - Compiler-Makros -Projekt in Sourceforge an.

Der PGI Compiler hat ein %code% Makro.

Sehen Sie sich auch libnuwen compiler.hh an, um einen ordentlichen Weg zu finden, Compiler-Versions-Makros zu "normalisieren".

    
___ tag123pgi ___ Die Portland Group (PGI) produziert Compiler (Fortran, C & C ++) für Hochleistungsrechner. Sie bieten Fortran-Compilern auch GPU-Unterstützung (CUDA Fortran sowie eine Implementierung von OpenACC). ___
Ville Laurikari 05.08.2009 14:06
quelle
0

Haben Sie sich die Boost-Header angeschaut? Angenommen, sie unterstützen PGI, haben sie einen Weg gefunden, es zu erkennen. Du könntest das benutzen. Ich würde irgendwo in boost/config suchen.

    
sbi 05.08.2009 14:53
quelle

Tags und Links