Почему искажение имен не влияет на основную функцию в C ++? - PullRequest
0 голосов
/ 20 ноября 2018

Компилятор C ++ часто искажает имена функций для поддержки многих функций.Программист может подавить искажение имени по умолчанию, используя extern "C" .Однако, почему int main(int, char **) никогда не затрагивается?

// test.cpp

int max(int a, int b) {
    return a > b ? a : b;
}

extern "C" {
    int min(int a, int b) {
        return a < b ? a : b;
    }
}

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

И

$  xcrun --sdk macosx clang -x c++ -c test.cpp -o test  
$  xcrun nm -nm test  

0000000000000000 (__TEXT,__text) external __Z3maxii  
0000000000000030 (__TEXT,__text) external _min  
0000000000000060 (__TEXT,__text) external _main  

Очевидно, int max(int, int) искажено до __Z3maxii;int min(int int) не содержит искажений с extern "C" аннотацией.

Как главное убежать от искажения?
Есть ли какой-нибудь способ удержать имя от искажения, кроме приведенной выше аннотации?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

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

Взгляните на https://en.cppreference.com/w/cpp/language/main_function

И вопросов о искажениях имен в C ++

(Main) специальных свойствах

Он не может быть предопределен и не может быть перегружен: по сути, имя main в глобальном пространстве имен зарезервировано для функций (хотя его можно использовать для именования классов, пространств имен, перечислений и любых объектов в неглобальном пространстве имен, за исключением того, чтофункция с именем "main" не может быть объявлена ​​со связью языка C в любом пространстве имен (начиная с C ++ 17))

0 голосов
/ 20 ноября 2018

За [basic.start.main]/1, [basic.start.main]/2 и [over]/1:

Программа должна содержать глобальную функциюназывается main.[...] Эта функция не должна быть перегружена.[...] Если для одного имени в одной и той же области заданы два или более разных объявления, это имя называется перегруженным [...].

Тогда это неопределенное поведение, чтобы иметь что-либо в глобальном пространстве имен с именем main.Тогда у реализации нет причин искажать main или даже считать ее правильной функцией.

...