是否应在声明或定义中指定visibility属性?

时间:2014-10-10 13:45:51

标签: c++ c visual-c++ gcc clang

his paper about shared libraries中,Ulrich Drepper建议在构建库时将符号可见性全局设置为隐藏,然后在源代码中设置为 default 对于每个要公开导出它的符号。但是,在搜索之后,我仍然不明白应该在何处指定可见性属性:声明定义?由于任何不属于接口的符号都不会在公共标题中声明,我认为后面的选项更好,但this page from Microsoft让我怀疑:那里,相应的属性似乎已设置在标题中。

例如,在libwayland,一个Wayland协议的开源实现,它完成如下:

wayland-client.h

void wl_event_queue_destroy(struct wl_event_queue *);

wayland-client.c

WL_EXPORT void
wl_event_queue_destroy(struct wl_event_queue *)
{
    /* ... */
}

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

1 个答案:

答案 0 :(得分:1)

对于GNU而言,这并不重要,但是在Windows标头声明中,无论如何都需要用dllimport进行注释,因此通常也可以在其中放置可见性注释。

请注意,仅在编译库本身时才需要启用可见性注释,而在仅调用库函数的代码编译时则无需启用

#ifndef WL_EXPORT
# define WL_EXPORT
#endif

在标题中。