是否应该在声明或定义中指定可见性属性?

Kal*_*ish 5 c c++ gcc clang visual-c++

Ulrich Drepper 在其关于共享库的论文中建议在构建库时将符号可见性全局设置为隐藏,然后在源代码中将每个要公开导出的符号设置为默认值。但是,在搜索之后,我仍然不知道应该在哪里指定可见性属性:在声明中还是在定义中?由于不会在公共头文件中声明任何不希望成为接口一部分的符号,因此我认为后面的选项更好,但是Microsoft的此页面使我感到怀疑:在那里,似乎在其中设置了相应的属性。标头。

例如,在libwayland(Wayland协议的开源实现)中,它的完成方式如下:

wayland-client.h

void wl_event_queue_destroy(struct wl_event_queue *);
Run Code Online (Sandbox Code Playgroud)

wayland-client.c

WL_EXPORT void
wl_event_queue_destroy(struct wl_event_queue *)
{
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

我担心与其他编译器和平台的兼容性:GCC,Clang,MSVC等。还要注意,此问题也适用于C ++。

yug*_*ugr 1

对于 GNU 来说这并不重要,但在 Windows 上头声明dllimport无论如何都需要用 s 进行注释,因此习惯上也将可见性注释放在那里。

请注意,仅在编译库本身时才需要启用可见性注释,而不是在编译仅调用库函数的代码时启用,因此大多数项目都会执行类似的操作

#ifndef WL_EXPORT
# define WL_EXPORT
#endif
Run Code Online (Sandbox Code Playgroud)

在标题中。