#define 지시문을 통해 LLVM 및 해당 버전을 감지하는 방법은 무엇입니까?
질문은 제 생각에 아주 분명합니다. 어떤 컴파일러가 사용되었는지와 어떤 버전이 사용되었는지 응용 프로그램 정보에 포함 할 수 있도록 컴파일러 감지 헤더를 작성하려고합니다.
이것은 내가 사용하는 코드의 일부입니다.
/* 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 또는 연타) 또는 그 소리를 확인하는 공식적인 방법이다.
__has_feature
그리고 __has_builtin
, 그들은 문서화되어 연타를 사용할 때 옵션 컴파일러 기능 검사의 권장되는 방법입니다 여기 .
다음을 사용하여 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의 경우 버전 번호를 테스트해서는 안되며 기능 검사 매크로를 사용 하여 원하는 기능을 확인해야합니다 .
// 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의 버전을 얻을 수있는 방법을 찾지 못했습니다 ..
Pre-defined Compiler Macros 페이지를 살펴보고 Compilers-> 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 (:
But anyway, if you need compiler version, you can use 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;
}
Output examples:
Clang-30400000
Clang-50000000
Note that if you're using llvm to hack on bytecode, and thus #include
ing llvm include files, you can check the macros in llvm/Config/llvm-config.h
. And concretely:
/* 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"
'Development Tip' 카테고리의 다른 글
다른 .c 파일간에 변수를 어떻게 공유합니까? (0) | 2020.11.26 |
---|---|
"$ @"의 마지막 매개 변수 앞의 매개 변수 추출 (0) | 2020.11.26 |
SQL과 프롤로그 비교 (0) | 2020.11.26 |
방금 저장 한 레코드의 ID를 얻는 방법 (0) | 2020.11.26 |
Firefox의 3D CSS 변환, 들쭉날쭉 한 가장자리 (0) | 2020.11.26 |