定义命名空间的变体和__visibility__的含义

Variant of defining a namespace and the meaning of __visibility__

本文关键字:visibility 命名空间 定义      更新时间:2023-10-16

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

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

我对这一行有疑问:

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

__attribute__是一个特定于gcc的语言扩展。它允许您以标准C++语言不直接支持的方式更改函数、命名空间或其他实体的声明。

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

这是新版本的gcc使用的编译器特定功能,用于控制从共享对象导出哪些符号。看见http://gcc.gnu.org/wiki/Visibility详细信息。

关于你的问题(2)。。。

__attribute__的双parens语法是让您在非GCC编译器上去掉#define

#ifndef __GNUC__
#define __attribute__(x)
#endif

双parens允许里面的东西变得复杂(例如,逗号分隔的属性序列),并且仍然可以被简单的宏拾取。