通过CMake或预处理器检查检测C ++编译器的[[noreturn]]支持?

时间:2015-11-04 00:56:08

标签: c++11 cmake

我正在使用一些本应支持C ++ 11和C ++ 03的代码。我想标记一个函数[[noreturn]]但是因为在C ++ 03中不存在,我试图弄清楚如何用预处理器符号来保护它。

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

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

托德格里尔写道:

  

您可以考虑使用Boost配置子系统中的代码。他们定义了几十个宏的列表,用于设置这些编译器中可用的功能:http://www.boost.org/doc/libs/1_53_0/libs/config/doc/html/boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.macros_that_describe_c__11_features_not_supported

     

-
  Todd Greer
  首席科学家,Affinegy,Inc。

然而,我没有找到任何似乎做我想要的东西。 (在boost配置中,或其他地方。)

有没有人知道使用C预处理器技巧直接执行此操作的方法,或者知道检测到此功能的现有CMake模块? (如果不是,我想我会尝试一起解决问题。)

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

#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()
{
    //...
}

答案 1 :(得分:1)

您可以执行以下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