请教类与类名之间TC_GAME_API的含义及宏定义解析
TC_GAME_API 含义及宏定义逻辑详解
一、TC_GAME_API 的本质
TC_GAME_API 是用于动态链接库(DLL/共享库)符号控制的宏,核心作用是控制类、函数等符号的可见性——决定当前编译单元是将目标符号导出给外部模块使用,还是从外部模块导入已导出的符号。
二、宏定义的逻辑拆解
先看这段宏代码:
#ifdef TRINITY_API_EXPORT_GAME # define TC_GAME_API TC_API_EXPORT #else # define TC_GAME_API TC_API_IMPORT #endif
逐行解释:
TRINITY_API_EXPORT_GAME是一个编译开关:当编译Game模块本身时,会在项目编译选项中提前定义这个宏(比如通过-DTRINITY_API_EXPORT_GAME参数),此时TC_GAME_API会被替换为TC_API_EXPORT。TC_API_EXPORT和TC_API_IMPORT是跨平台封装的导出/导入关键字:- 在Windows平台,它们通常对应
__declspec(dllexport)(导出)和__declspec(dllimport)(导入); - 在Linux/macOS平台,一般对应控制符号可见性的属性(比如
__attribute__((visibility("default"))))。
- 在Windows平台,它们通常对应
- 如果未定义
TRINITY_API_EXPORT_GAME,说明当前编译的是依赖Game模块的其他模块(如Auth模块、自定义脚本模块),此时TC_GAME_API会被替换为TC_API_IMPORT,表示要从Game模块导入目标符号。
三、结合模板类代码的实际作用
再看这段模板类代码:
template class TC_GAME_API ScriptRegistry<VehicleScript>;
这是模板类的显式实例化代码,加上 TC_GAME_API 的意义在于:
- 编译Game模块时,这个标记会将
ScriptRegistry<VehicleScript>这个具体的模板实例导出,其他依赖模块可以直接使用该类,无需自行实例化模板,避免重复编译。 - 编译依赖模块时,这个标记表示要从Game模块导入已经实例化好的
ScriptRegistry<VehicleScript>类,确保链接时能找到正确的符号,避免链接错误。
内容的提问来源于stack exchange,提问作者WilliamWong
相关产品推荐
相关产品推荐

