出口制造商,符号可见性,......?

时间:2016-02-26 22:18:50

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

我正在尝试开发一个必须与平台无关的库。在编写库API时,最好为某些预处理器定义的函数创建一些前缀。

例如,Windows API有WINAPI,OpenMPI有OMPI_DECLSPEC等等......

的openmpi:

OMPI_DECLSPEC  int MPI_Init(int *argc, char ***argv);

的OpenGL:

GLAPI void GLAPIENTRY glBegin( GLenum mode );

通过这个预处理器定义,程序员可以为库中的函数设置导出选项,可见性,调用约定。在OpenGL函数声明中,如您所见,有两种不同的预处理器定义。

文献中这个前缀的名称是什么?

在此页面中

编辑 https://gcc.gnu.org/wiki/Visibility,讨论了该主题。我想,这种宏值得一个特殊的名字。我们可以将它命名为“可见性宏”或其他东西,但是这个宏可以根据编译器,操作系统等设置其他类型的东西......

2 个答案:

答案 0 :(得分:3)

  

文献中这个前缀的名称是什么?

他们被称为macros。它们有助于使用C和C ++语言进行条件编译。在这些日子里,它们也被用作typedef的替代品。以GLAPIENTRY为例,它的定义如下:

#define GLAPIENTRY __stdcall

如果作者必须将调用约定更改为__cdecl,如果__stdcall直接放在函数声明中,那么对于每个函数都必须更改。但是,使用宏,只需重新定义即可:

#define GLAPIENTRY __cdecl

答案 1 :(得分:1)

据我所知,这些类型的宏没有特定的名称,但如果我必须给这些名称,我必须将它们标记为“ context macros ”或者(更具体到函数)“函数属性可移植性上下文宏”,因为它们通常是根据编译单元的上下文定义的。

这可以进一步分为其他类别:

  • 可移植性宏例如:
    • __attribute__()__declspec()
    • __attribute__((always_inline))__forceinline
    • 或将不受支持的属性定义为空
  • 编译上下文
    • static vs extern
    • 可见性上下文宏(隐藏,默认,受保护,内部/符号,...)

可移植性上下文宏用于克服编译器和/或主机/目标体系结构和操作系统之间的差异。这些不仅包括可见性(包括任何特殊功能属性)之间的差异

编译上下文宏可以允许使用相同的源来有效地编译不同类型的编译,例如静态与PIC和库与二进制。这些可能包括各种内联或可见性指令,具体取决于编译上下文。

在给出的例子中

GLAPI void GLAPIENTRY glBegin( GLenum mode );

GLAPI 表示编译上下文(可能还包含相关的可移植性宏), GLAPIENTRY 只是一个可移植性宏包装器一组特定的函数属性(它是一个“跨平台”的API)。