UNITY_BUILD_UNIQUE_ID

在 3.20 版本中添加。

一个有效的 C 语言标识符的名称,在 Unity 构建期间,该标识符会被设置为一个每个文件唯一的(per-file)值。

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

给定

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

符号 MY_UNITY_ID 被定义为一个每个文件唯一的(per-file)值。

此标识符的一个已知用例是,在有限范围内区分匿名命名空间中的变量。匿名命名空间在 Unity 构建中会带来问题,因为它们用于确保某些变量和声明的作用域限定在翻译单元(translation unit),而翻译单元被近似为单个源文件。当源文件在 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;
}

假名命名空间(pseudonymous namespace)在真正的匿名命名空间中使用。在许多平台上,这保持了在执行 Unity 构建时,内部符号不具有外部链接(external linkage)的不变性。