2011-09-14 5 views
3

에서 GCC 대 LLVM을 결정 나는 다음에 매크로 비슷한을 작성하려고 해요 :하지만 애플 LLVM 3.0 컴파일러,컴파일시

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

을 그리고이 작동합니다. 컴파일 시간에 컴파일 타임에 깨지기 때문에 다른 것보다 더 유용하지 않습니다.

#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

Apple 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