Wie LLVM und seine Version durch #define Richtlinien zu erkennen?
-
06-07-2019 - |
Frage
Die Frage ist ganz klar, denke ich. Ich versuche, einen Compiler Erkennung Header zu schreiben, in der Anwendung, Informationen zu können, umfasst, auf dem Compiler verwendet wurde und welche Version.
Dies ist ein Teil des Codes verwende ich:
/* GNU C Compiler Detection */
#elif defined __GNUC__
#ifdef __MINGW32__
#define COMPILER "MinGW GCC %d.%d.%d"
#else
#define COMPILER "GCC %d.%d.%d"
#endif
#define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
#endif
, die wie folgt verwendet werden:
printf(" Compiled using " COMPILER "\n", COMP_VERSION);
Gibt es eine Möglichkeit LLVM und seine Version zu erkennen? Und CLANG?
Lösung
Der __llvm__
und __clang__
Makros ist der offizielle Weg für ein LLVM-Compiler (gcc-llvm oder Klappern) oder Klirren zu überprüfen ist.
__has_feature
und __has_builtin
sind die empfohlene Methode für optionale Compiler Funktionen des Prüfens, wenn Klappern mit, sie dokumentieren
Andere Tipps
Ich kann keine Antwort hier, nur Links zu Antworten, also auf Vollständigkeit finden, hier ist die Antwort:
__clang__ // set to 1 if compiler is clang
__clang_major__ // integer: major marketing version number of clang
__clang_minor__ // integer: minor marketing version number of clang
__clang_patchlevel__ // integer: marketing patch level of clang
__clang_version__ // string: full version number
ich zur Zeit:
__clang__=1
__clang_major__=3
__clang_minor__=2
__clang_patchlevel__=0
__clang_version__="3.2 (tags/RELEASE_32/final)"
Für Klirren, sollten Sie nicht die Versionsnummer testen, sollten Sie für Features überprüfen Sie mit Feature Überprüfung Makros .
Snippet von InitPreprocessor.cpp :
// Compiler version introspection macros.
DefineBuiltinMacro(Buf, "__llvm__=1"); // LLVM Backend
DefineBuiltinMacro(Buf, "__clang__=1"); // Clang Frontend
// Currently claim to be compatible with GCC 4.2.1-5621.
DefineBuiltinMacro(Buf, "__GNUC_MINOR__=2");
DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
DefineBuiltinMacro(Buf, "__GNUC__=4");
DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
DefineBuiltinMacro(Buf, "__VERSION__=\"4.2.1 Compatible Clang Compiler\"");
Ich habe keine Art und Weise finde die Version von LLVM und Klirren selbst zu bekommen, obwohl ..
Werfen Sie einen Blick auf die Vorgegebene Compiler Makros , wählen Sie Compilers-> Clang . Es gibt Informationen über viele andere Makros für Standards, Compiler, Bibliotheken, OS, Architekturen und vieles mehr.
Ich bin damit einverstanden, dass die beste Wahl verwenden hat Eigenschaft macroses, nicht Version macroses. Beispiel mit steigern :
#include <boost/config.hpp>
#if defined(BOOST_NO_CXX11_NOEXCEPT)
#if defined(BOOST_MSVC)
#define MY_NOEXCEPT throw()
#else
#define MY_NOEXCEPT
#endif
#else
#define MY_NOEXCEPT noexcept
#endif
void my_noexcept_function() MY_NOEXCEPT; // it's example, use BOOST_NOEXCEPT (:
Aber wie auch immer, wenn Sie Compiler-Version , können Sie boost.predef
#include <iostream>
#include <boost/predef.h>
int main() {
#if (BOOST_COMP_CLANG)
std::cout << BOOST_COMP_CLANG_NAME << "-" << BOOST_COMP_CLANG << std::endl;
#else
std::cout << "Unknown compiler" << std::endl;
#endif
return 0;
}
Ausgabe Beispiele:
Clang-30400000
Clang-50000000
Beachten Sie, wenn Sie llvm verwenden auf Bytecode zu hacken und damit #include
ing llvm Include-Dateien, können Sie die Makros in llvm/Config/llvm-config.h
überprüfen. Und konkret:
/* Major version of the LLVM API */
#define LLVM_VERSION_MAJOR 3
/* Minor version of the LLVM API */
#define LLVM_VERSION_MINOR 8
/* Patch version of the LLVM API */
#define LLVM_VERSION_PATCH 0
/* LLVM version string */
#define LLVM_VERSION_STRING "3.8.0"