Подтвердить что ты не робот

Обнаружение версий компилятора во время компиляции

Это и вопрос, и ссылка, и я надеюсь, что люди смогут опираться на это, чтобы его могли повторно использовать люди с похожими вопросами.

Как мы можем надежно обнаружить конкретную версию компилятора C/С++/ObjC? Теперь я знаю ответ для Visual Studio и частично знаю ответ для Xcode.

Теперь для компилятора Visual Studio мы имеем _MSC_VER, который определяется этими значениями:

Version 1.0    800
Version 2.0    900
Version 2.x    900
Version 4.0    1000
Version 5.0    1100
Version 6.0    1200
Version 7.0    1300
Version 7.1    1310
Version 8.0    1400  (Visual Studio 2005)
Version 9.0    1500  (Visual Studio 2008)
Version 10.0   1600  (Visual Studio 2010)
Version 11.0   1700  (Visual Studio 2012)

Теперь для компилятора Xcode это определение:

__APPLE_CC__

Но единственные значения, которые мне удалось найти через google (у документов Mac, похоже, нет таких значений):

Xcode 3.0              5465
Xcode 3.1              5470
Xcode 3.1 (GCC 4.2)    5553
Xcode 3.2.3            5664  (Got this value from my own compiler)

Может ли кто-нибудь заполнить этот список или предоставить ссылки на полный список? И, возможно, мы можем предоставить информацию и для других компиляторов.

4b9b3361

Ответ 1

Как кто-то, кто портировал больше, чем его справедливую долю "С", я могу видеть, откуда вы пришли, вот некоторые из них, чтобы мы начали:

Для продукта компилятора IBM CL/С++:

__xlc__  - Format is V.R.M.F eg: "9.0.0.0"
__IBMCPP__ Format is an integer as VRM eg: V9.0 is 900
__IBMC__ - Format is an integer as VRM, 
           which indicates the level of compiler as VRM as:
< 200 is C Set/2
< 300 is C Set++
otherwise is Visual Age C++ V.M.C

           where V=version, M=release, M=modification and F=fix level.

Для Borland C:

___BORLANDC__ ??

Для GNU C:

__GNUC__ ??

Для Watcon C:

__WATCOMC__

Ответ 2

Здесь приведена таблица этой информации:

https://sourceforge.net/p/predef/wiki/Compilers/

К сожалению, похоже, что MacOS определяет __clang__, __GNUCC__ и __llvm__, поэтому эта информация может немного запутаться.

Но обычно применяется только один набор информации.