C не работает с искажением имен, хотя он добавляет символ подчеркивания к именам функций, поэтому printf(3)
на самом деле _printf
в объекте libc.
В C ++ история другая. История этого заключается в том, что изначально Страуструп создал «C с классами» или cfront , компилятор, который переводил бы ранний C ++ в C. Затем остальные инструменты - компилятор C и компоновщик мы использовали бы для создания объектного кода , Это подразумевало, что имена C ++ должны были как-то переводиться в имена C. Это именно то, что делает название искажения . Он предоставляет уникальное имя для каждого члена класса, а также функцию и переменную глобального / пространства имен, поэтому имена пространств и классов (для разрешения) и типы аргументов (для перегрузки) так или иначе включены в окончательные имена компоновщиков.
Это очень легко увидеть с помощью таких инструментов, как nm(1)
- скомпилируйте исходный код C ++ и посмотрите на сгенерированные символы. Следующее на OSX с GCC:
namespace zoom
{
void boom( const std::string& s )
{
throw std::runtime_error( s );
}
}
~$ nm a.out | grep boom
0000000100001873 T __ZN4zoom4boomERKSs
Как в C, так и в C ++ локальные (автоматические) переменные не производят никаких символов, но живут в регистрах или в стеке.
Edit:
Локальные переменные не имеют имен в результирующем объектном файле по простой причине, что компоновщик не должен знать о них. Так что ни имени, ни увечья. Все остальное (на что должен смотреть этот компоновщик) искажено в C ++.