编写代码支持新的和更老的C++编译器?

编写代码支持新的和更老的C++编译器?,c++,c++11,C++,C++11,我必须写一段代码来支持新的和旧的编译器,在我开始之前我想知道这样的事情可能吗 #ifndef C++11 { //some code..... } #endif else #ifndef older C++ version { //some code......} #endif 在MSV中,您可以使用宏\u MSC\u VER来帮助您。我不知道是否有这样一个标准的宏。在MSV中,你有一个宏,可以帮助你。我不知道是否有这样的标准宏。没有简单的通用宏,对于大多数编译器来说,它不是二进制的

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

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

else 

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

在MSV中,您可以使用宏\u MSC\u VER来帮助您。我不知道是否有这样一个标准的宏。

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

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

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

Clang具有相当全面的特定于功能的宏,其形式为_ u u u u,我不记得这是否是确切的名称


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

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

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

Clang具有相当全面的特定于功能的宏,其形式为_ u u u u,我不记得这是否是确切的名称


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

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

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


因此,最可移植的解决方案是不可移植,并且在检测到C++11支持时设置自己的宏,并使用一些头/配置脚本来使用上述内容,该标准要求符合C++11标准的实现将名为uu cplusplus的宏定义为值201103L。建议不符合要求的编译器使用最多五位小数的值。C++03的情况也是如此,其中应定义为199711L的值

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


<> P>最便携的解决方案是不可移植的,当你检测到C++ 11的支持时,你有自己的宏,并且有一些头/配置脚本,你可以使用上面提到的东西,还有可能的其他支持的编译器。

< P> C++标准委员会花了很多的努力来确定,以旧标准编写的任何代码在新标准中仍然有效。如果你不得不在某些平台上不使用某项功能,那么在其他平台上使用它是一项艰巨的工作,几乎没有任何收获。因此,只需坚持使用您需要支持的旧版本即可


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

< P> C++标准委员会花了很多的努力来确保,任何写入旧标准的代码在新的标准中仍然有效。如果你不得不在某些平台上不使用某项功能,那么在其他平台上使用它是一项艰巨的工作,几乎没有任何收获。因此,只需坚持使用您需要支持的旧版本即可

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

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

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

然后,应该为旧编译器编写另一个.cpp

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

你不需要定义


请参见编写与最新编译器兼容的代码

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

然后,应该为旧编译器编写另一个.cpp

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

你不需要定义


请参见

您可能可以这样做,但将代码限制在语言和标准库中没有显著变化的部分可能更容易。如果您想支持较旧的编译器,为什么不首先编写C++98?谢谢,我正在一个使用gcc 3.4.X版本编译器的系统上进行项目,也就是一个非常旧的集群,我用最新的gcc 4.6.2在它上面安装了gentoo前缀,并想测试新的东西,确保它们也适用于旧系统。你可能可以做类似的事情,但是,将代码限制在语言和标准库中没有显著变化的部分可能更容易。如果您想支持较旧的编译器,为什么不首先编写C++98?谢谢,我正在使用gcc 3.4.X版本编译器的系统上进行项目,即非常旧的群集,我用最新的GCC4.6.2在其上安装了gentoo前缀,并希望测试新事物,确保它们也适用于旧系统