Определите LLVM против GCC во время компиляции - PullRequest
3 голосов
/ 14 сентября 2011

Я пытаюсь написать макрос, подобный следующему:

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

И это работает, но только с компилятором Apple LLVM 3.0.Он ломается во время компиляции для чего-то еще, означающего, что я должен сократить его до

#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

Ответы [ 2 ]

4 голосов
/ 14 сентября 2011

Должно работать с Макросом проверки функций Clang :

// 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
1 голос
/ 14 сентября 2011

Компилятор Apple LLVM определяет __clang__.

...