【问题标题】:Alternative ways to create file scope in Unity Builds在 Unity Builds 中创建文件范围的替代方法
【发布时间】:2025-12-08 04:50:02
【问题描述】:

我正在尝试使用 Unity Builds 来缩短 Windows 上 c++ 项目的构建时间。我遇到的几个问题之一是单一文件范围问题。

一旦所有源代码都包含在一个源文件中,它们就会共享相同的文件范围。所有使用相同名称的本地定义符号将重复并导致编译错误。

目前,我必须使用文件后缀更改每个重复的名称以避免重复。但我认为可能会有更好的解决方案。

【问题讨论】:

    标签: c++ build


    【解决方案1】:

    我想分享我目前的解决方案。

    1. 在生成unity_build_source_<index>.cpp 文件时,定义一个UNITY_BUILD 宏并用宏包装每个包含源代码:

      // unity_build_souce file, automatically generated, do not edit manually.
      #define UNITYBUILD_CONCATENATE_DETAIL(x, y) x##y
      #define UNITYBUILD_CONCATENATE(x, y) UNITYBUILD_CONCATENATE_DETAIL(x, y)
      #define UNITYBUILD_MAKE_UNIQUE(x) UNITYBUILD_CONCATENATE(x, _UNITYBUILD_COUNTER)
      #define UNITY_BUILD
      
      // for each source code
      #define _UNITY_BUILD_COUNTER 1
      #include <path/to/source1.cpp>
      #undef _UNITY_BUILD_COUNTER
      
      #define _UNITY_BUILD_COUNTER 2
      #include <path/to/source2.cpp>
      #undef _UNITY_BUILD_COUNTER
      
      // ...
      
    2. 在源代码中,对重复的名称使用 UNITYBUILD_MAKE_UNIQUE 宏。

      #ifdef UNITY_BUILD
      #define a_duplicated_variable      UNITYBUILD_MAKE_UNIQUE(a_duplicated_variable)
      #define ADuplicatedClass           UNITYBUILD_MAKE_UNIQUE(ADuplicatedClass)
      #define aDuplicatedFunction        UNITYBUILD_MAKE_UNIQUE(aDuplicatedFunction)
      #endif
      
      namespace
      {
          int a_duplicated_variable = 3;
          class ADuplicatedClass
          {
          public:
               ADuplicatedClass(int ){}
          };
      }
      
      void aDuplicatedFunction()
      {
          ADuplicatedClass c(a_duplicated_variable);
      }
      
      #ifdef UNITY_BUILD
      #undef a_duplicated_variable
      #undef ADuplicatedClass
      #undef aDuplicatedFunction
      #endif
      

    我知道这个解决方案看起来仍然很糟糕。与手动更改每个重复的符号相比,它保留了旧名称的外观。

    【讨论】: