UNITY_BUILD_UNIQUE_ID

在 3.20 版本加入.

在统一构建期间设置为每个文件唯一值的有效 C 标识符的名称。

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

鉴于:

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

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

此标识符的一个已知用例是在有限范围内消除匿名名称空间中变量的歧义。匿名命名空间为统一构建带来了问题,因为它们用于确保某些变量和声明的范围限定为由单个源文件近似的翻译单元。当源文件组合在一个统一构建文件中时,不同文件中的那些变量组合在一个翻译单元中并且名称冲突。此属性可用于通过如下代码避免这种情况:

// 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;
}

假名命名空间在真正匿名的命名空间中使用。在许多平台上,这保持不变,即在执行统一构建时,其中的符号不​​会获得外部链接。