Domanda

Penso che la domanda sia abbastanza chiara. Sto cercando di scrivere un'intestazione di rilevamento del compilatore per poter includere nelle informazioni dell'applicazione su quale compilatore è stato utilizzato e su quale versione.

Questo fa parte del codice che sto usando:

/* 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

Quale potrebbe essere usato in questo modo:

printf("  Compiled using " COMPILER "\n", COMP_VERSION);

Esiste un modo per rilevare LLVM e la sua versione? E CLANG?

È stato utile?

Soluzione

Le macro __llvm__ e __clang__ sono il modo ufficiale per verificare la presenza di un compilatore LLVM (llvm-gcc o clang) o clang, rispettivamente.

__has_feature e __has_builtin sono i modi consigliati per verificare le funzionalità opzionali del compilatore quando si usa clang, sono documentati qui .

Nota che puoi trovare un elenco delle macro del compilatore incorporato per gcc, llvm-gcc e clang usando:

echo | clang -dM -E -

Ciò preelabora una stringa vuota e sputa tutte le macro definite dal compilatore.

Altri suggerimenti

Non riesco a trovare una risposta qui, solo collegamenti a risposte, quindi per completezza, ecco la risposta:

__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

Ricevo attualmente:

__clang__=1
__clang_major__=3
__clang_minor__=2
__clang_patchlevel__=0
__clang_version__="3.2 (tags/RELEASE_32/final)"

Per clang, non dovresti testare il suo numero di versione, dovresti verificare le funzionalità che desideri con macro controllo funzionalità .

Snippet da 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\"");

Non ho trovato alcun modo per ottenere la versione di llvm e clang, ma ..

Dai un'occhiata alla pagina Macro del compilatore predefinita , seleziona Compilatori- > Clang . Ci sono informazioni su molte altre macro per standard, compilatori, librerie, SO, architetture e altro.

Sono d'accordo che la scelta migliore sia quella di utilizzare ha macro di funzionalità , non macro di versione. Esempio con boost :

#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 (:

Ma comunque, se hai bisogno della versione del compilatore , puoi usare 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;
}

Esempi di output:

Clang-30400000
Clang-50000000

Nota che se stai usando llvm per hackerare il bytecode, e quindi #include ing llvm include i file, puoi controllare le macro in llvm / Config / llvm-config.h . E concretamente:

/* 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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top