将gcc属性与C++11属性语法结合使用
Using gcc attributes with C++11 attributes syntax
我试图将GCC属性与C++11语法一起使用。例如:
static void [[used]] foo(void)
{
// ...
}
但我得到了以下内容:
warning: ‘used’ attribute ignored [-Wattributes]
static void [[used]] foo(void)
^
为什么该属性被忽略?是否可以将GCC属性用作C++属性?
[[gnu::used]] static void foo(void) {}
首先,属性只能出现在特定的地方,否则你会得到:
x.cc:1:13: warning: attribute ignored [-Wattributes]
static void [[gnu::used]] foo(void) {}
^
x.cc:1:13: note: an attribute that appertains to a type-specifier is ignored
其次,used
不是标准的警告,因此它被隐藏在专有的名称空间gnu::
中。
C++11中没有[[used]]
属性,这就是它被忽略的原因(*)
有特定于gcc的__attribute__((used))
,可以应用于静态对象或函数定义。它告诉编译器发出定义,即使该符号似乎根本没有使用——换句话说,它确保这样的符号将出现在结果对象文件中。
(*)需要忽略它,因为标准允许实现定义额外的、特定于实现的属性。因此,将未知属性视为错误是没有意义的(类似的情况:#pragma
指令)。
一些附加信息:
属性为实现定义的语言扩展提供统一的标准语法,例如GNU和IBM语言扩展
__attribute__((...))
、Microsoft扩展__declspec()
等。
而且,可能是最重要的部分:
C++标准只定义了以下属性。所有其他属性都是特定于实现的。
[[noreturn]]
[[carries_dependency]]
[[deprecated]]
(C++14)[[deprecated("reason")]]
(C++14)
源:属性说明符序列。
gcc属性与C++11中引入的属性不同。
used
是gcc特定的属性,应该使用gcc属性语法__attribute__((used))
引入。标准C++中没有[[used]]
属性,因此gcc将忽略它
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 多态性和功能结合
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 助记符和指向成员语法的指针
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 应用于类型别名声明的 [[maybe_unused]] 属性的语法
- 属性语法中的 C++ alignas 说明符
- boost :: Spirit :: Karma语法:逗号从结构上划定了带有选件属性的输出
- 哪些 gnu 属性具有 c++11 语法
- 具有数据成员语法的零成本属性
- 将gcc属性与C++11属性语法结合使用
- OpenCL C++上下文属性语法
- Boost图库:可以将绑定属性与内部属性相结合
- Boost.精神语法.属性和所有问题(_V)
- Boost的属性.Spirit语法:Boost::variant的std:vector错误
- 将boost::spirit符号表作为继承属性传递到语法中
- 结合二元算子AST节点的Boost Spirit Qi语法
- 如何获得xml属性与此语法使用Qt DOM
- Qt正确使用属性语法
- 具有合成和继承属性的深度递归qi语法(解析器)