什么是 _GLIBCXX_VISIBILITY?
What is _GLIBCXX_VISIBILITY?
我正在查看 gcc 中包含的一些标准 header 的源代码(在 /usr/include/c++/
中),并在每个 header 的顶部找到以下内容:
namespace std _GLIBCXX_VISIBILITY(default)
_GLIBCXX_VISIBILITY(default)
到底是什么?
这是一个预处理器宏。并定义为:
#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
#define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V)))
#else
#define _GLIBCXX_VISIBILITY(V)
#endif
因此,如果 _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
为真,那么在您的情况下它将扩展为:
__attribute__ (( __visibility__ ("default")))
否则,如果 _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
为假,它什么都不做。
__visibility__
属性用于定义符号在 DSO 文件中的可见性。使用 "hidden" 而不是 "default" 可用于隐藏 DSO 之外的符号。
例如:
__attribute__ ((__visibility__("default"))) void foo();
__attribute__ ((__visibility__("hidden"))) void bar();
函数 foo()
可以在 DSO 外部使用,而 bar()
基本上是私有的,只能在 DSO 内部使用。
您可以在此处详细了解 __visibility__
属性:https://gcc.gnu.org/wiki/Visibility
我正在查看 gcc 中包含的一些标准 header 的源代码(在 /usr/include/c++/
中),并在每个 header 的顶部找到以下内容:
namespace std _GLIBCXX_VISIBILITY(default)
_GLIBCXX_VISIBILITY(default)
到底是什么?
这是一个预处理器宏。并定义为:
#if _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
#define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V)))
#else
#define _GLIBCXX_VISIBILITY(V)
#endif
因此,如果 _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
为真,那么在您的情况下它将扩展为:
__attribute__ (( __visibility__ ("default")))
否则,如果 _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY
为假,它什么都不做。
__visibility__
属性用于定义符号在 DSO 文件中的可见性。使用 "hidden" 而不是 "default" 可用于隐藏 DSO 之外的符号。
例如:
__attribute__ ((__visibility__("default"))) void foo();
__attribute__ ((__visibility__("hidden"))) void bar();
函数 foo()
可以在 DSO 外部使用,而 bar()
基本上是私有的,只能在 DSO 内部使用。
您可以在此处详细了解 __visibility__
属性:https://gcc.gnu.org/wiki/Visibility