什么是_GLIBCXX_VISIBILITY?

use*_*690 7 c++ g++

我正在浏览gcc(in /usr/include/c++/)中包含的一些标准头文件的源代码,并在每个头文件的顶部找到以下内容:

namespace std _GLIBCXX_VISIBILITY(default)
Run Code Online (Sandbox Code Playgroud)

到底是_GLIBCXX_VISIBILITY(default)什么?

Dav*_*xon 15

它是一个预处理器宏.并定义为:

#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
#define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V)))
#else
#define _GLIBCXX_VISIBILITY(V) 
#endif
Run Code Online (Sandbox Code Playgroud)

所以,如果_GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY是真的,那么在你的情况下,它将扩展为:

__attribute__ (( __visibility__ ("default")))
Run Code Online (Sandbox Code Playgroud)

否则如果_GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY是假则不会做任何事情.

__visibility__属性用于定义DSO文件中符号的可见性.使用"隐藏"而不是"默认"可以用来隐藏DSO之外的符号.

例如:

__attribute__ ((__visibility__("default"))) void foo();
__attribute__ ((__visibility__("hidden"))) void bar();
Run Code Online (Sandbox Code Playgroud)

该功能foo()可以在DSO外部使用,但bar()基本上是私有的,只能在DSO中使用.

您可以在__visibility__此处阅读有关该属性的更多信息:https://gcc.gnu.org/wiki/Visibility