UNITY_BUILD_UNIQUE_ID
Добавлено в версии 3.20.
Имя допустимого C-идентификатора, которому во время сборок unity присваивается уникальное для каждого файла значение.
Если это свойство задано и 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.
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD_UNIQUE_ID.html