UNITY_BUILD_UNIQUE_ID¶
在 3.20 版本中添加。
一个有效的 C 语言标识符的名称,在 unity 构建期间会设置为一个每个文件唯一的(unique 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 构建中近似于单个源文件。当源文件在 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)的不变量。