2013-06-12 5 views
3

Может кто-нибудь помочь мне понять соглашения об управлении gcc-именами?G ++ name mangling глобальных константных переменных

Рассмотрим следующий пример тестового кода

#include <stdio.h> 

const int x = 42; 
int y = 42; 

int main(int argc, const char* argv[]) 
{ 
     return 0; 
} 

При запуске nm я получаю следующее (неожиданное?) Результат:

0000000000000000 T main 
0000000000000000 D y 
0000000000000000 r _ZL1x 

Это показывает, что компилятор только искалечил глобальные переменные, помещенные в только для чтения раздел. Я бы ожидал, что компилятор либо нарушит глобальные переменные ALL, либо NO

Это намеренное поведение? Для меня это выглядит непоследовательно.

+5

Вы компилируете C или C++? Также обратите внимание, что 'x' неявно является' static' (по крайней мере, на C++), а 'y' - нет. – Angew

+1

неявно 'static' действительно? Это означает, что в двух разных единицах компиляции видимые адреса 'x' будут разными? Вау. Хорошо знать. К счастью, C не играет в такие игры. –

+0

Я компилирую как C++ –

ответ

3

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

С x неявно статично, несколько единиц перевода могут легально иметь разные переменные, все называемые x, поэтому символ искажается, чтобы избежать столкновений.

Поскольку y является не статическим, может быть только одна глобальная переменная y в программе, так что нет никакой необходимости, чтобы избежать столкновений (они должны либо быть помечены как нарушения УСО или дублированные компоновщика).

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

+1

Хорошо подытоживают две вещи: глобальные константные переменные неявно статичны, и только статические переменные в области файла искажаются. Я не вижу необходимости, чтобы статические переменные искажались в C++. C может справиться с этим без !? Поэтому для меня это только побочный эффект, скрывающий проблему глобальных константных переменных, неявно статичных. Для решения этой проблемы я явно должен определить их внешний вид, чтобы сделать их глобально видимыми. –

 Смежные вопросы

  • Нет связанных вопросов^_^