【问题标题】:Reduce recompilation when editing global variables编辑全局变量时减少重新编译
【发布时间】:2015-03-26 00:51:07
【问题描述】:

我正在开发一款游戏, 我有很多 .cpp 文件依赖的 const 全局变量 .h 文件的巨大列表。 (敌人想知道玩家的最大生命值等)

但是,当任何变量在文件中更改以进行游戏平衡时,这将是一场编译噩梦。

为了方便负责游戏平衡的人,我想防止将文件分成多个标题。

但是,重新分类有点痛苦(清晰度与编译时间,玩家的最大马力在许多 .cpp 中使用,但它应该属于 PlayerVariables.h,在每个使用它的文件中都包含它,这破坏了把它们分开)。

除了上述方法之外,还有其他方法可以节省时间吗?

【问题讨论】:

    标签: c++ compilation global-variables constants game-engine


    【解决方案1】:

    只需在头文件中声明全局变量即可。并在另一个源文件中定义它们。这样,如果更改了任何值,则只需重新编译 globals.cpp,因为所有内容都包括来自 hpp 的全局变量。

    在 globals.hpp 中:

    extern const unsigned PLAYER_MAX_HEALTH;
    

    在 globals.cpp 中:

    #include "globals.hpp"
    
    const unsigned PLAYER_MAX_HEALTH = 100;
    

    【讨论】:

    • 还有一个优点:编译时常量和常量传播。
    • 嘿,感谢您的推荐,我刚刚这样做了,只是在将它们与数组大小和枚举一起使用时出现了一些小问题,很好地解决了输入两次名称的缺点哈哈,我会的稍等片刻,看看有什么探索的可能性,然后再标记为答案!
    • 任何解决问题的方法都意味着必须在源文件中定义全局变量的值。对头文件所做的任何更改总是意味着需要重新编译包含头文件的所有源文件。您在数组大小和枚举方面遇到了什么问题?
    • 没什么,只是编译器拒绝在数组声明和 c 样式枚举(无符号表示)中接受 extern 常量,我只是将它们移动到需要它们的地方或在没有 extern 的情况下保留它们(他们没有改变经常)。
    【解决方案2】:

    您可以尝试使用预处理器添加配置步骤:

    1. config.h 中只有预处理器#defines
    2. 使用预处理器将其拆分为多个标头,仅提取他们需要声明实际 const 变量/枚举值/其他的那些定义。
    3. 仅复制与之前版本不同的文件。
    4. 还可以选择使用 glabals.cpp 定义可能还需要定义的那些符号。
    5. 确保在更新配置后(重新)运行 make。

    与仅声明外部常量变量并在不同的翻译单元中定义和初始化它们相比的优点是常量传播和具有适当的编译时常量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多