كيفية الكشف عن 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 و الإصدار ؟ ورنة?

هل كانت مفيدة؟

المحلول

وحدات الماكرو __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)"

لرنة، يجب أن لا اختبار رقم الإصدار الخاص به، يجب التحقق من الميزات التي تريدها مع ميزة وحدات الماكرو فحص .

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 ورنة نفسها، على الرغم من ..

ونلقي نظرة على محددة قبل صفحة وحدات الماكرو مترجم ، حدد <لأ 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 الإختراق على بايت كود، وبالتالي #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