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 构建时,其中的符号不会获得外部链接。