UNITY_BUILD_UNIQUE_ID

在版本 3.20 中新增。

在合併建置期間,設定為每個檔案唯一值的有效 C 識別符名稱。

當此屬性被填充且 UNITY_BUILD 為 true 時,此屬性值會用於定義指定名稱的編譯器定義。已定義符號的值未指定,但它對於每個檔案路徑都是唯一的。

給定

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

假名命名空間在真正的匿名命名空間內使用。在許多平台上,這保持了在執行合併建置時,內部符號不會獲得外部連結的不變性。