2011-09-14 4 views
3

Je suis en train d'écrire une macro similaire à ce qui suit:Déterminer LLVM GCC par rapport au moment de la compilation

#ifndef DEPRECATED_ATTRIBUTE_MESSAGE 
    #define DEPRECATED_ATTRIBUTE_MESSAGE(message) __attribute__((deprecated (message))) 
#endif 

Et cela fonctionne, mais seulement avec le compilateur d'Apple LLVM 3.0. Il brise au moment de la compilation pour quoi que ce soit d'autre sens que je dois dépouiller jusqu'à

#ifndef DEPRECATED_ATTRIBUTE_MESSAGE 
    #define DEPRECATED_ATTRIBUTE_MESSAGE(message) __attribute__((deprecated)) 
#endif 

qui est beaucoup moins utile.

Ma question:

Je pense que la solution est d'appliquer une macro pour identifier la version du compilateur au moment de la compilation. Existe-t-il un moyen d'identifier le compilateur Apple LLVM 3.0 par rapport à LLVM GCC 4.2 ou GCC 4.2 (ou autre chose)?

Idéalement, je voudrais travailler quelque chose comme ça, mais je ne peux pas trouver la macro droit de le comprendre:

#ifdef [Apple LLVM 3.0] 
    #ifndef DEPRECATED_ATTRIBUTE_MESSAGE 
    #define DEPRECATED_ATTRIBUTE_MESSAGE(message) __attribute__((deprecated (message))) 
    #endif 
#else 
    #ifndef DEPRECATED_ATTRIBUTE_MESSAGE 
    #define DEPRECATED_ATTRIBUTE_MESSAGE(message) __attribute__((deprecated)) 
    #endif 
#endif 

Répondre

4

Il devrait fonctionner avec Clang’s feature checking macros:

// In case the compiler/preprocessor doesn't support __has_extension 
#ifndef __has_feature   // Optional of course. 
    #define __has_feature(x) 0 // Compatibility with non-clang compilers. 
#endif 
#ifndef __has_extension 
    #define __has_extension __has_feature // Compatibility with pre-3.0 compilers. 
#endif  

#if __has_extension(attribute_deprecated_with_message) 
    #ifndef DEPRECATED_ATTRIBUTE_MESSAGE 
    #define DEPRECATED_ATTRIBUTE_MESSAGE(message) __attribute__((deprecated (message))) 
    #endif 
#else 
    #ifndef DEPRECATED_ATTRIBUTE_MESSAGE 
    #define DEPRECATED_ATTRIBUTE_MESSAGE(message) __attribute__((deprecated)) 
    #endif 
#endif 
+0

Cela a totalement fonctionné. Merci. – Hyperbole

1

Le compilateur Apple LLVM définit __clang__.

+0

Clang définit '__clang__', mais malheureusement' llvm-gcc' ne l'est pas. Est-ce que quelqu'un sait comment distinguer 'gcc' de' llvm-gcc'? La raison pour laquelle j'ai besoin de cela, c'est que 'llvm-gcc' a des différences importantes. Par exemple, 'llvm-gcc' 4.2 ne définit pas' __GXX_RTTI' quand 'gcc' le fait. –

+0

Voici la réponse: 'llvm-gcc' définit' __llvm__'. –

+0

Le fait que 'llvm-gcc-4.2' ne définisse pas' __GXX_RTTI' n'a rien à voir avec le fait qu'il utilise LLVM; c'est exactement comme ça que gcc 4.2 se comporte. – servn

Questions connexes