#Define 지시문을 통해 LLVM 및 해당 버전을 감지하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1617877

  •  06-07-2019
  •  | 
  •  

문제

질문은 내가 생각합니다. 컴파일러 감지 헤더를 작성하여 사용 된 컴파일러 및 버전에 대한 응용 프로그램 정보에 포함시킬 수 있습니다.

이것은 내가 사용하는 코드의 일부입니다.

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

다음과 같이 사용할 수 있습니다.

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

LLVM과 해당 버전을 감지하는 방법이 있습니까? 그리고 Clang?

도움이 되었습니까?

해결책

그만큼 __llvm__ 그리고 __clang__ 매크로는 각각 LLVM 컴파일러 (LLVM-GCC 또는 Clang) 또는 Clang을 확인하는 공식적인 방법입니다.

__has_feature 그리고 __has_builtin Clang을 사용할 때 옵션 컴파일러 기능을 확인하는 권장 방법은 문서화됩니다. 여기.

다음을 사용하여 GCC, LLVM-GCC 및 Clang 용 내장 컴파일러 매크로 목록을 찾을 수 있습니다.

echo | clang -dM -E -

이 전처리는 빈 끈을 사용하고 컴파일러에 의해 정의 된 모든 매크로를 뱉어냅니다.

다른 팁

여기서 답을 찾을 수없고 답에 대한 링크 만 찾을 수 없으므로 완전성을 위해 다음은 다음과 같습니다.

__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

나는 현재 얻는다 :

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

Clang의 경우 버전 번호를 테스트해서는 안되며 원하는 기능을 확인해야합니다. 기능 검사 매크로.

스 니펫 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\"");

그래도 LLVM과 Clang 자체의 버전을 얻을 방법을 찾지 못했습니다.

살펴보십시오 사전 정의 된 컴파일러 매크로 페이지, 고르다 컴파일러-> Clang. 표준, 컴파일러, 라이브러리, OS, 아키텍처 등의 다른 많은 매크로에 대한 정보가 있습니다.

최선의 선택은 사용하는 것이라는 데 동의합니다 기능이 있습니다 버전 매크로가 아닌 매크로스. 예를 들어 후원:

#include <boost/config.hpp>

#if defined(BOOST_NO_CXX11_NOEXCEPT)
 #if defined(BOOST_MSVC)
  #define MY_NOEXCEPT throw()
 #else
  #define MY_NOEXCEPT
 #endif
#else
 #define MY_NOEXCEPT noexcept
#endif

void my_noexcept_function() MY_NOEXCEPT; // it's example, use BOOST_NOEXCEPT (:

그러나 어쨌든 필요하다면 컴파일러 버전, 당신이 사용할 수있는 boost.predef:

#include <iostream>
#include <boost/predef.h>

int main() {
#if (BOOST_COMP_CLANG)
  std::cout << BOOST_COMP_CLANG_NAME << "-" << BOOST_COMP_CLANG << std::endl;
#else
  std::cout << "Unknown compiler" << std::endl;
#endif
  return 0;
}

출력 예 :

Clang-30400000
Clang-50000000

LLVM을 사용하여 바이트 코드를 해킹하는 경우 #includeing llvm은 파일을 포함하고 매크로를 확인할 수 있습니다. llvm/Config/llvm-config.h. 그리고 구체적으로 :

/* Major version of the LLVM API */
#define LLVM_VERSION_MAJOR 3

/* Minor version of the LLVM API */
#define LLVM_VERSION_MINOR 8

/* Patch version of the LLVM API */
#define LLVM_VERSION_PATCH 0

/* LLVM version string */
#define LLVM_VERSION_STRING "3.8.0"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top