我四处浏览SDL 2头文件,发现遇到的大多数函数都具有以下形式:
extern DECLSPEC int SDLCALL SDL_FunctionName();
Run Code Online (Sandbox Code Playgroud)
我明白了什么extern,int和SDL_FunctionName所有的平均值(存储类说明,返回值,函数名,分别)。但是,我必须承认,我从未见过DECLSPEC和SDLCALL以前一样。搜索前者只会产生Win32 / 64 API,而后者则没有任何好处。
这两件事是什么意思,它们是做什么的?
这些常量定义为通过C / C ++编译器更改符号(函数)的导出行为。
DECLSPEC是C / C ++头文件中使用的宏。它代表__declspec(dllexport)或__declspec(dllimport)取决于您是项目库还是使用者。有关更多详细信息,请参见此处。
在该类的声明/拥有项目中,DECLSPEC解析为__declspec(dllexport)。这告诉编译器允许从DLL外部访问这些功能。它还更改了编译器的默认命名行为(称为名称修饰或名称修饰),以允许更轻松地从DLL外部访问这些符号。看这里。
在消费项目中,DECLSPEC解决__declspec(dllimport)。这不是严格必要的,但是它的使用允许编译器为消耗的符号生成更有效的代码,例如在生成thunk时。看这里。
SDLCALL将是一个常量,它声明函数的调用约定。你可以阅读更多关于调用约定,如__stdcall,__cdecl等在这里。
这些宏仅通过重新定义常量即可使程序在许多不同的体系结构和平台之间可移植。通常,平台上使用的编译器或SDK具有全局定义的这些宏。