【问题标题】:Variant of defining a namespace and the meaning of __visibility__定义命名空间的变体和 __visibility__ 的含义
【发布时间】:2011-06-07 03:53:20
【问题描述】:

今天,在看到<iostream> (g++ 4.4.1) 的 预处理 代码时,我看到了一条在语法上对我来说很不寻常的行。

namespace std __attribute__ ((__visibility__ ("default"))) {
// ...
}

我对该特定行有疑问:

  1. __attribute__ 是什么以及它是什么 在std 之后做什么? (新语法!)
  2. 双大括号(( ... )) 是如何出现的?它是一种新语法吗?
  3. __visibility__ 是什么,什么是 它设置为"default" ?

【问题讨论】:

    标签: c++ gcc syntax attributes namespaces


    【解决方案1】:

    __attribute__gcc-specific language extension. 它允许您以标准 C++ 语言不直接支持的方式更改函数、命名空间或其他实体的声明。

    C++0x 增加了对属性的语言支持,尽管语法不同并且大多数属性仍然是特定于实现的。

    【讨论】:

      【解决方案2】:

      这是新版本的 gcc 用来控制从共享对象导出哪些符号的编译器特定功能。详情请见http://gcc.gnu.org/wiki/Visibility

      【讨论】:

        【解决方案3】:

        至于你的问题(2)……

        __attribute__ 的双括号语法是让您在非 GCC 编译器上使用 #define 它:

        #ifndef __GNUC__
        #define __attribute__(x)
        #endif
        

        双括号允许里面的东西很复杂(例如,一个逗号分隔的属性序列),但仍然被简单的宏拾取。

        【讨论】:

        • 难道知道!现在看来很明显了。那么,这就是所有三个答案。
        • @andrewdski:是的,我已经投票给另外两个了。团队合作。 :-)
        猜你喜欢
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多