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



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

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

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

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

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

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

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

Clang有相当全面的特定于功能的宏,形式为_HAS_<feature>(我记不清这是不是确切的名称)。

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

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

C++标准委员会花费了大量精力来确保任何编写到旧标准的代码在新标准中仍然有效。如果你不得不在某些平台上不使用某个功能,那么在其他平台上使用它是一项艰巨的工作,几乎没有任何收益。所以,只要坚持使用您需要支持的旧版本即可。

对于少数例外情况,最可靠的方法是测试编译器并定义宏来选择要使用的版本。如果你知道你的编译器集,可以手动,如果你不知道,可以使用autoconf或cmake。有许多编译器支持某些C++11功能,而不支持其他功能,因此,如果不进行任何工作,就很难找到足够的测试。我相信所有的特性都可以通过编译进行测试;如果进行编译,它们通常也能正常工作。

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

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

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

对于较旧的构建,选择包含较旧的.cpp.

您不需要#defines。

参见#ifdef认为有害

最新更新