Добавление к этому, так как информация, представленная здесь, является, по крайней мере, неполной.Большинство компиляторов создают «локальный» символ для статических переменных, и да, поскольку именование статических переменных в области действия функции не уникально, им приходится манипулировать именами.Например, gcc делает это, добавляя точку и уникальный номер к имени.Поскольку точка не является частью какого-либо действительного идентификатора, это гарантирует отсутствие конфликта имен.
Все становится неясным, когда компилятор поддерживает универсальные символы в идентификаторах.В зависимости от среды, компилятор должен манипулировать такими идентификаторами, так как, например, загрузчик может не поддерживать такие символы в таблице символов.
icc выбирает что-то вроде замены такого символа на _uXXXX, где XXXX - это шестнадцатеричное представлениехарактер.В этом случае (icc) это приводит к двум тонким ошибкам компилятора.Во-первых, это искажение использует допустимые идентификаторы, которые пользователю разрешено использовать, поэтому они могут конфликтовать для глобальных символов с идентификаторами из той же единицы компиляции или даже из других единиц.Во-вторых, icc даже смешивает свое собственное внутреннее именование и резервирует место только для одной статической переменной, и, если они, например, также объявлены, volatile
полностью переходит в дикую природу.