了解 C++ 可见性支持

Understanding C++ visibility support

-- 如 GCC Wiki - Visibility. I have exercised and Simple C++ Symbol Visibility Demo 所述,但仍不理解 GCC Wiki - 可见性 文章的某些部分。

在其 Step-by-step_guide 你会发现

For every non-templated non-static function definition in your library (both headers and source files), decide if it is publicly used or internally used

在其他例子中我发现只修饰头文件中的声明就足够了。为什么还要修饰源文件中的定义?

If it is publicly used, mark with FOX_API like this: extern FOX_API PublicFunc()

我在其他示例中没有看到这个 extern 关键字,我也从未将它用于 public 函数。为什么我必须在这里使用它?

The given macro 开头为

#ifdef FOX_DLL // defined if FOX is compiled as a DLL

如果使用 CMake FOX_DLL 在哪里或如何定义?

In the other examples I found that it is sufficient to only decorate the declarations in the header files. Why also decorate the definitions in the source files?

如果在 header 中声明了全局函数,并且 header 包含在函数 已定义 的源文件中,注释在 header 就足够了(编译器确实会从 header 中获取属性)。否则你需要在源代码中对其进行注释。

I haven't seen this extern keyword in the other examples and I have never used it for public functions. Why do I have to use it here?

extern 关键字在函数声明中是可选的,但通常用于清晰。

您可能会对两种相反的可见性方法感到困惑。您同时命名 GCC(来自 UNIX 角落)和 DLL(来自 Windows 角落)。

UNIX 默认情况下具有完全可见性,Windows 默认情况下没有可见性。因此,要修改这两个默认值,您必须朝相反的方向移动。

C++(以及之前的 C)没有共享库或可见性的概念,这是有道理的:没有多少东西需要标准化。你最终会得到像这样的不可移植的方法。