UNITY_BUILD_UNIQUE_ID

在版本 3.20 中添加。

Unity 构建期间,已设置的有效 C 标识符的名称,每个文件值唯一。

填充此属性且 UNITY_BUILD 为 true 时,属性值用于定义指定名称的编译器定义。定义符号的值未指定,但是每个文件路径唯一。

给定

set_target_properties(myTarget PROPERTIES
  UNITY_BUILD "ON"
  UNITY_BUILD_UNIQUE_ID "MY_UNITY_ID"
)

MY_UNITY_ID 符号定义为每个文件唯一的值。

为此标识符已知的一个用例是在有限范围内匿名命名空间中去除变量的模糊性。匿名命名空间对 Unity 构建提出了一个问题,因为它们用于确保特定变量和声明的作用域局限于一个翻译单元,而一个源文件近似表示此翻译单元。当在 Unity 构建文件中组合源文件时,这些不同文件中的变量在单个翻译单元中组合,且名称冲突。该属性可以通过如下代码避免这一点

// Needed for when unity builds are disabled
#ifndef MY_UNITY_ID
#define MY_UNITY_ID
#endif

namespace { namespace MY_UNITY_ID {
  // The name 'i' clashes (or could clash) with other
  // variables in other anonymous namespaces
  int i = 42;
}}

int use_var()
{
  return MY_UNITY_ID::i;
}

伪匿名命名空间在真正匿名命名空间中使用。在许多平台上,它维持以下不变性:执行 Unity 构建时,内部的符号不会获取外部链接。