2011-09-14 10 views
3

でGCC対LLVMを決定します。それは私がはるかに少ない便利ですは、私は次のようなマクロを書く似たしようとしているコンパイル時

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

にそれを取り除くために持っている意味、何のためにコンパイル時に壊れます。

私の質問:

私は解決策は、コンパイル時にコンパイラのバージョンを識別するためのいくつかのマクロを適用することだと思います。 Apple LLVM 3.0コンパイラとLLVM GCC 4.2またはGCC 4.2(または何か他のもの)を区別する方法はありますか?

理想的には、私はこのような何かをうまくしたいのですが、私はそれを把握する権利マクロを見つけることができません。

#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 

答えて

4

それは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

これは完全に機能しました。ありがとう。 – Hyperbole

1

アップルLLVMコンパイラは__clang__を定義します。

+0

Clangは '__clang__'を定義しますが、残念ながら' llvm-gcc'は定義しません。誰も 'gcc'と' llvm-gcc'を区別する方法を知っていますか?私がこれを必要とする理由は、 'llvm-gcc'にはいくつかの重要な違いがあります。たとえば、 'llvm-gcc' 4.2では' gcc'が '__GXX_RTTI'を定義しません。 –

+0

これは答えです: 'llvm-gcc'は' __llvm__'を定義します。 –

+0

'llvm-gcc-4.2'が' __GXX_RTTI'を定義していないという事実は、LLVMを使用していることとは関係ありません。これはgcc 4.2の動作です。 – servn

関連する問題