首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过C++编译器通过CMake或预处理器检查来检测[[不返回]]支持?

通过C++编译器通过CMake或预处理器检查来检测[[不返回]]支持?
EN

Stack Overflow用户
提问于 2015-11-04 00:56:07
回答 2查看 443关注 0票数 3

我正在处理一些应该同时支持C++11和C++03的代码。我想标记一个函数[[noreturn]],但是由于C++03中不存在这个函数,所以我试图找出如何最好地使用预处理器符号来保护它。

在这个电子邮件线程中,建议尝试检查是否支持单个功能,而不是所有的C++11:

https://cmake.org/pipermail/cmake/2013-February/053635.html

托德·格里尔写道:

您可以考虑使用Boost的配置子系统中的代码。这里有几十个宏的列表,它们定义这些宏来设置在这里的编译器中可用的特性:supported -- 托德·格里尔 阿菲纳利公司首席科学家

然而,我没有找到任何我想做的事。(在boost config中,或者其他地方)。

有谁知道用C预处理技巧直接完成这个任务的方法,或者知道现有的CMake模块可以检测到这个特性吗?(如果不是的话,我想我会尝试将其中一个拼凑在一起。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-04 01:30:39

试着做这样的事情:

代码语言:javascript
运行
复制
#ifdef __has_cpp_attribute
#  if __has_cpp_attribute(noreturn)
#    define NO_RETURN [[noreturn]]
#  else
#    define NO_RETURN
#  endif
#else
#  define NO_RETURN
#endif

NO_RETURN void myFunc()
{
    //...
}
票数 3
EN

Stack Overflow用户

发布于 2015-11-04 08:46:20

您可以执行以下CMake检查:

代码语言:javascript
运行
复制
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来完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33511929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档