编写支持新旧c ++编译器的代码?

时间:2012-02-15 12:51:36

标签: c++ c++11

我必须编写一个可以支持更新和更旧的编译器的代码,我在开始之前想知道这样的事情可能吗?

#ifndef C++11 { //some code..... } 
#endif 

else 

#ifndef older C++ version { //some code......}
#endif

5 个答案:

答案 0 :(得分:6)

该标准要求符合C ++ 11的实现将名为__cplusplus的宏定义为值201103L。建议不合格编译器使用最多五位小数的值。对于C ++ 03也是如此,其中应定义的值为199711L

然而,没有多少编制者认为(编辑)自己符合标准,例如gcc很长一段时间将其定义为1L。此外,您还必须考虑它不仅是编译器版本,还包括编译器的参数。当您通过-std=c++0x-std=gnu++0x时,Gcc仅支持(部分)C ++ 11。在这些情况下,它将定义宏__GXX_EXPERIMENTAL_CXX0X__

因此,最便携的解决方案是不可移植并拥有您在检测到C ++ 11支持时设置的宏,并且有一些头文件/配置脚本,其中您使用上述内容,以及其他可能的其他内容支持的编译器。

答案 1 :(得分:3)

没有简单的通用宏,对于大多数编译器来说,它不是二进制“是或否”。大多数编译器都实现了一些 C ++ 11特性,但肯定不是全部。

MSVC只有一个_MSC_VER宏指示编译器的版本,如果知道哪个版本支持哪些功能,那么你可以使用它。

Clang拥有非常全面的功能特定宏,格式为_HAS_<feature>(我不记得这是否是精确的名称)。

如果您想知道,在所有编译器中,功能X是否可用,您必须检查所有这些不同的宏并自行确定答案。 :)

答案 2 :(得分:1)

在MSVS中,你有一个可以帮助你的宏_MSC_VER。我不知道是否有这样一个标准的宏。

答案 3 :(得分:1)

C ++标准委员会花了很多精力确保编写到旧标准的任何代码在新标准中仍然有效。如果你不得不在某些平台上使用某个功能,那么在其他平台上使用它是很多工作,很少有任何收获。所以只需坚持你需要支持的旧版本。

对于少数例外,最可靠的方法是测试编译器并定义宏以选择要使用的版本。如果你知道你的编译器集合或使用autoconf或cmake之类的东西,你可以手动操作。有许多编译器支持某些C ++ 11功能,而不支持其他编程器,所以没有希望找到一些只需你工作就可以完成的测试。我相信所有功能都可以通过编译来测试;如果他们编译,他们通常也会工作。

答案 4 :(得分:1)

编写代码以符合最新的编译器。

任何不能针对旧版本编译的代码都应该提取到自己的.cpp单元中。

然后应为旧编译器编写替代.cpp。

对于旧版本,请选择包含较旧的.cpp。

您不需要#defines。

请参阅#ifdef Considered Harmful