[英]writing code that supports new and older c++ compilers?
我必须编写一个可以支持较新和较旧的编译器的代码,我想知道在开始之前是否可能会出现这种情况?
#ifndef C++11 { //some code..... }
#endif
else
#ifndef older C++ version { //some code......}
#endif
该标准要求符合C ++ 11的实现才能将名为__cplusplus
的宏定义为值201103L
。 建议不合格的编译器使用最多包含五个十进制数字的值。 对于C ++ 03也是如此,该值应定义为199711L
。
但是,很少有编译器认为自己符合标准,例如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被认为有害
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.