c++ - _GLIBCXX_VISIBILITY 是什么?

标签 c++ g++

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

namespace std _GLIBCXX_VISIBILITY(default)

_GLIBCXX_VISIBILITY(默认) 到底是什么?

最佳答案

这是一个预处理器宏。并定义为:

#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 为 false,它将什么都不做。

__visibility__ 属性用于定义符号在 DSO 文件中的可见性。使用“隐藏”而不是“默认”可用于对 DSO 外部的事物隐藏符号。

例如:

__attribute__ ((__visibility__("default"))) void foo();
__attribute__ ((__visibility__("hidden"))) void bar();

foo() 函数可以在 DSO 外部使用,而 bar() 基本上是私有(private)的,只能在 DSO 内部使用。

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

关于c++ - _GLIBCXX_VISIBILITY 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270208/

相关文章:

c++ - 如何检查 pthread_mutex_t 是否被锁定

c++ - g++ 警告,使用了内联虚函数但未定义

c++ - G++ 编译器在每次运行后返回相同的变量地址(即使在名称更改后)

c++ - 如何在 Mac 上将 #include <random> 与 g++ 一起使用?

c++ - 如果要求比较器是严格的全排序而不仅仅是严格的弱排序,C++ 标准算法会更快吗?

c++ - 如何将 ui 文件类中的按钮连接到其他类中的插槽?

c++ - 如何打印 Voronoi 图的面?

multithreading - 什么是clang中g++的-pthread equiv?

c++ - 使用 malloc 初始化一个类

c++ - 移动 vector 结构