__has_cpp_attribute 不是“类函数"宏?
我正在尝试将 [[deprecated]]
属性引入我的代码库.但是,并非我需要支持的所有编译器都支持这种语法(在标准化之前不同编译器使用的各种方法在 属性标准化提案 N2761).因此,我尝试在此属性中进行有条件地编译,首先使用 __has_cpp_attribute
类似宏的函数(如果可用),如下所示:
I am attempting to introduce the [[deprecated]]
attribute into my codebase. However, not all the compilers I am required to support have support for this syntax yet (the various method used by different compilers before standardization are described in the attribute standardization proposal N2761). Thus, I am attempting to conditionally compile in this attribute, using the __has_cpp_attribute
macro-like function first, if it is available, like so:
#if defined(__has_cpp_attribute) && __has_cpp_attribute(deprecated)
#define DEPRECATED(msg) [[deprecated(msg)]]
#elif OTHER_COMPILER
// ...
#endif
但是,我在使用 gcc 版本 4.9.2 (GCC)
,命令行 gcc -std=c++14 cpp.cpp代码>:
However, I'm getting errors when compiling this I am using gcc version 4.9.2 (GCC)
, command line gcc -std=c++14 cpp.cpp
:
cpp.cpp:1:56: error: missing binary operator before token "("
#if defined(__has_cpp_attribute) && __has_cpp_attribute(deprecated)
此错误似乎表明 __has_cpp_attribute
已定义,但它不是宏函数.有条件地编译 gcc 中的 [[deprecated]]
属性的正确方法是什么?
This error seems to indicate that __has_cpp_attribute
is defined, but that it is not a macro function. What is the proper way to conditionally compile the [[deprecated]]
attribute in gcc?
推荐答案
GCC 4.9没有__has_cpp_attribute
,&&
的短路行为没有扩展到允许无效的构造跟随它.
GCC 4.9 doesn't have __has_cpp_attribute
, and the short-circuiting behavior of &&
does not extend to allowing invalid constructs to follow it.
也就是说,如果没有定义foo
,
That is to say, if foo
isn't defined,
#if defined(foo) && foo(bar)
无效.
你想要的是
#if defined(__has_cpp_attribute)
#if __has_cpp_attribute(deprecated)
#define DEPRECATED(msg) [[deprecated(msg)]]
#endif
#elif OTHER_COMPILER
// ...
#endif
以便使用 __has_cpp_attribute
的条件在一个组中,如果 __has_cpp_attribute
未定义,则该组将被跳过.(当在一个被跳过的组中时,预处理指令仅通过指令的名称进行处理;其余标记被忽略.)
so that the condition using __has_cpp_attribute
is in a group that is skipped if __has_cpp_attribute
is not defined. (When in a group that is skipped, preprocessing directives are only processed through the directive's name; the remaining tokens are ignored.)
相关文章