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?

War es hilfreich?

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)"

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 #includeing 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"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top