我正在处理一些应该同时支持C++11和C++03的代码。我想标记一个函数[[noreturn]],但是由于C++03中不存在这个函数,所以我试图找出如何最好地使用预处理器符号来保护它。
在这个电子邮件线程中,建议尝试检查是否支持单个功能,而不是所有的C++11:
https://cmake.org/pipermail/cmake/2013-February/053635.html
托德·格里尔写道:
您可以考虑使用Boost的配置子系统中的代码。这里有几十个宏的列表,它们定义这些宏来设置在这里的编译器中可用的特性:supported -- 托德·格里尔 阿菲纳利公司首席科学家
然而,我没有找到任何我想做的事。(在boost config中,或者其他地方)。
有谁知道用C预处理技巧直接完成这个任务的方法,或者知道现有的CMake模块可以检测到这个特性吗?(如果不是的话,我想我会尝试将其中一个拼凑在一起。)
发布于 2015-11-04 08:46:20
您可以执行以下CMake检查:
include(CheckCXXSourceCompiles)
check_cxx_source_compiles("
   [[noreturn]] void testFunc()
   {}
   int main(void)
   {
     return 0;
   }
"  HAS_ATTRIBUTE_NORETURN
)然后,您可以将HAS_ATTRIBUTE_NORETURN传递给your config.h,并在C++代码中使用ifdef。
优点是,您不会错过不设置正确的_cpluplus变量或不支持__has_attribute特性的编译器。
根据设置的不同,您可能需要添加标志来设置C++模式(如-std=c++11或c++0x)。这可以通过CMakePushCheckState和修改CMAKE_REQUIRED_FLAGS来完成。
https://stackoverflow.com/questions/33511929
复制相似问题