Как глобальные статические / нестатические переменные искажаются в c? - PullRequest
1 голос
/ 08 июня 2011

Я могу представить себе статические переменные var внутри функции func с именами как var@func,

как насчет глобальных статических и нестатических переменных?

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Компиляторам не нужно однозначно присваивать имена с внутренними связями, например статические переменные и функции. Вы не можете получить доступ к статическим объектам за пределами модуля перевода, поэтому компоновщику не нужно получать имя для них.

Глобальные переменные с внешней связью обычно не имеют большого количества искажений или декораций, применяемых к их именам, и зачастую они точно такие же, что и функции. Единственное подчеркивание не является чем-то необычным.

2 голосов
/ 08 июня 2011

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

Все становится неясным, когда компилятор поддерживает универсальные символы в идентификаторах.В зависимости от среды, компилятор должен манипулировать такими идентификаторами, так как, например, загрузчик может не поддерживать такие символы в таблице символов.

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

...