在Unity Builds中创建文件范围的替代方法

Alternative ways to create file scope in Unity Builds

本文关键字:方法 范围 文件 Unity Builds 创建      更新时间:2023-10-16

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

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

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

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

  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
    

我知道这个解决方案仍然很糟糕。与手动更改每个重复的符号相比,它保持了旧名称的原样。