Пожалуйста, рассмотрите следующую программу 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
Это потому, что программа определяет глобальную переменную, имя которой совпадает с именем, которое функция получает после искажения имени.
Я могу придумать множество способов решения этой проблемы, самый простой из которых - использовать два подчеркивания в начале искаженного имени (два подчеркивания зарезервированы для частного использования).
Вопрос: почему была выбрана схема, которая делает это возможным?