2010-08-28 110 views
8

这既是一个问题,也是一个参考,我希望人们可以在此基础上进行构建,以便具有类似问题的人员可以重用它。在编译期间检测编译器版本

我们如何可靠地检测到C/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__ 

但我唯一的值已设法通过谷歌(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) 

Can an an yone完成此列表或提供完整列表的链接?也许我们也可以为其他编译器提供信息。

+2

Visual Studio和Xcode都不是编译器 - 你不应该关心它们的版本。 – alternative 2010-08-28 22:52:07

+3

@mathepic我和下一个人一样迂腐,但真的吗? VS为每个版本的IDE提供了特定版本的前端编译器,并通过_MSC_VER公开了该版本;这就是他想要的 – 2010-08-28 22:54:40

+1

让我让自己清楚。是的,他们都是集成开发环境,但它们都与自己的编译器打包在一起,这正是我所说的。我希望从我的信息中清楚。 – Cthutu 2010-08-28 22:57:20

回答

1

正如有人谁比他的“C”周围的公平份额移植更多,我可以看到是你是从哪里来的,所以这里的一些人让我们开始:

对于IBM CL/C++编译器产品:

__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__ 
+0

您是否知道如何获取有关C#编译器的相同信息?在VS for C#中,_MSC_VER不再可用。什么是? – 2012-06-25 20:12:47

+0

我不知道任何Microsoft C#编译器中的预定义,但单声道编译确实有'__Mo​​noCS__'它提供了方便..(哦,你有调试) – 2012-06-25 21:40:59