我正在使用一些本应支持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模块? (如果不是,我想我会尝试一起解决问题。)
答案 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
。