我正在尝试开发一个必须与平台无关的库。在编写库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,讨论了该主题。我想,这种宏值得一个特殊的名字。我们可以将它命名为“可见性宏”或其他东西,但是这个宏可以根据编译器,操作系统等设置其他类型的东西......
答案 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)。