You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请教类与类名之间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"))))。
  • 如果未定义 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:42:02