2012-05-23 4 views
1

Можно создать дубликат:
Is main() overloaded in C++?Почему имя mangling не нарушает мою программу?

вот мой код:

#include <iostream> 

int main(void* a, void* b) 
{ 
    std::cout << "hello standalone " << std::endl;      
    return 0; 
} 

различные параметры должны иметь другое имя символа после названия коверкая (void* a, void* b) должна отличаться от (int, char**) , но эта программа не имеет проблем при запуске.

Почему?

+0

У вас должен быть очень простой компилятор, чтобы не жаловаться на этот код –

ответ

3

Это зависит от компилятора. Стандартными требуемыми сигнатурами для основного являются:

int main() 
int main(int argc, char** argv) 
int main(int argc, char* argv[]) 

Но помимо этого, компилятор также может предоставить другие подписи.

Например, GCC 4.3.4 отвергает код - http://ideone.com/XZp2h

МСВС жалуется неразрешенной внешнеположенность.

+0

Кажется, что всегда работает, независимо от того, что такое подписи, 'main' обрабатывается специально в компиляторах? –

+0

@new_perl это зависит от компилятора. –

+0

@new_perl см. Отредактированный ответ. –

5

Потому что main - это специальный случай, и компилятор создает для него специальный код. Как правило, main будет вызываться из начальной процедуры —, которая часто называется crt0 в старых компиляторах —, написанных на C, поэтому компилятор будет генерировать main, как если бы он был объявлен extern "C". Но это никоим образом не требуется; это просто типичная реализация.

+0

Есть ли у вас какие-либо ссылки, чтобы доказать, что это особый случай? –

+0

Интересный [crt0] (http://en.wikipedia.org/wiki/Crt0) содержит статью в википедии. –

+0

Типичный выход 'nm':' 000000000040dca9 T main'; что подтверждает, что он совсем не искалечен. –