66 votes

Comment détecter LLVM et sa version via les directives #define?

La question est assez claire je pense. J'essaie d'écrire un en-tête de détection du compilateur pour pouvoir inclure dans l'application des informations sur le compilateur utilisé et la version.

Cela fait partie du code que j'utilise:

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

Ce qui pourrait être utilisé comme ceci:

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

Est-il possible de détecter LLVM et sa version? Et CLANG?

78voto

Daniel Dunbar Points 1809

L' __llvm__ et __clang__ macros sont le moyen officiel pour vérifier un compilateur LLVM (llvm-gcc ou clang) ou clang, respectivement.

__has_feature et __has_builtin sont le moyen de vérifier en option les fonctions du compilateur lors de l'utilisation de clang, ils sont documentés ici.

Notez que vous pouvez trouver une liste des builtin compilateur macros pour gcc, llvm-gcc et clang à l'aide de:

echo | clang -dM -E -

Cette pré-traite une chaîne vide et crache toutes les macros définies par le compilateur.

49voto

Walter Points 7554

Je ne trouve pas de réponse ici, mais uniquement des liens vers les réponses. Voici donc la réponse:

 __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
 

Je reçois actuellement:

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

22voto

Chris Lattner Points 682

Pour clang, vous ne devez pas tester son numéro de version, vous devez rechercher les fonctionnalités souhaitées avec les macros de vérification des fonctionnalités .

10voto

Christoph Points 64389

Extrait de 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\"");
 

Je n’ai trouvé aucun moyen d’obtenir la version de llvm et de s’écraser, bien que ..

7voto

Matt Joiner Points 29194

Jetez un coup d’œil à la page Macros de compilateur prédéfinis , sélectionnez Compilateurs-> Clang . Il existe des informations sur de nombreuses autres macros pour les normes, les compilateurs, les bibliothèques, les systèmes d'exploitation, les architectures, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X