UNITY_BUILD_UNIQUE_ID

在版本 3.20 中新增。

在單一編譯 (unity build) 期間,設定為每個檔案唯一值的有效 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;
}

偽匿名命名空間被用在一個真正的匿名命名空間中。在許多平台上,這保持了當執行單一編譯時,其中的符號不會獲得外部連結的不變性。