كيفية الكشف عن LLVM و نسخته من خلال #تعريف التوجيهات?
-
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 و الإصدار ؟ ورنة?
المحلول
وحدات الماكرو __llvm__
و__clang__
هي الطريقة الرسمية للتحقق من وجود مترجم LLVM (llvm-دول مجلس التعاون الخليجي أو رنة) أو رنة، على التوالي.
وهي الطريقة الموصى بها من التحقق من وجود ميزات مترجم اختياري عند استخدام رنة، موثقة __has_feature
و__has_builtin
أنها <لأ href = "http://clang.llvm.org/docs/LanguageExtensions.html#feature_check" يختلط = "noreferrer "> هنا .
لاحظ أنه يمكنك العثور على قائمة من وحدات الماكرو مترجم مدمج لدول مجلس التعاون الخليجي، llvm-دول مجلس التعاون الخليجي، ورنة باستخدام:
echo | clang -dM -E -
وهذا preprocesses سلسلة فارغة ويبصق كافة وحدات الماكرو التي حددها المجمع.
نصائح أخرى
وأنا لا يمكن العثور على إجابة هنا، وصلات فقط إلى إجابات، وذلك للتأكد من اكتمالها، وهنا هو الجواب:
__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)"
لرنة، يجب أن لا اختبار رقم الإصدار الخاص به، يجب التحقق من الميزات التي تريدها مع ميزة وحدات الماكرو فحص .
// 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 ورنة نفسها، على الرغم من ..
ونلقي نظرة على محددة قبل صفحة وحدات الماكرو مترجم ، حدد <لأ href = " http://predef.sourceforge.net/precomp.html#sec4 "يختلط =" noreferrer "> Compilers-> رنة . وهناك معلومات عن العديد من وحدات الماكرو الأخرى للمعايير والمجمعين، والمكتبات، ونظام التشغيل، أبنية وأكثر من ذلك.
أوافق على أن أفضل خيار هو استخدام لديه ميزة macroses ، وليس نسخة macroses.على سبيل المثال مع دفعة:
#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 (:
ولكن على أي حال, إذا كنت بحاجة إلى مترجم النسخة, يمكنك استخدام دفعة.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 الإختراق على بايت كود، وبالتالي #include
ing 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"