Почему C ++ искажения в Linux не уникальны - PullRequest
0 голосов
/ 11 января 2019

Пожалуйста, рассмотрите следующую программу C ++:

int _Z5func2v;

void func2() {
}

Когда вы пытаетесь его скомпилировать, происходит сбой:

$ g++ test.cpp -c
/tmp/cc1RDxpU.s: Assembler messages:
/tmp/cc1RDxpU.s:13: Error: symbol `_Z5func2v' is already defined
/tmp/cc1RDxpU.s: Error: .size expression for _Z5func2v does not evaluate to a constant

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

Я могу придумать множество способов решения этой проблемы, самый простой из которых - использовать два подчеркивания в начале искаженного имени (два подчеркивания зарезервированы для частного использования).

Вопрос: почему была выбрана схема, которая делает это возможным?

1 Ответ

0 голосов
/ 11 января 2019

Имена, начинающиеся с одного подчеркивания, за которым следует заглавная буква, зарезервированы так же, как имена, содержащие два подчеркивания.

Например, из стандарта C ++ 2003, раздел 17.4.3.1.2, «Каждое имя, которое содержит двойное подчеркивание (__) или начинается со знака подчеркивания, за которым следует заглавная буква (2.11): Зарезервировано для реализации для любого использования. "

...