2012-05-23 3 views
1

가능한 중복은 :왜 이름 맹 글링으로 인해 프로그램이 깨지지 않습니까?

#include <iostream> 

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

다른 매개 변수 ((int, char** 달라야합니다 void* a, void* b)) 맹 글링 이름 뒤에 다른 심볼 이름이 있어야합니다 여기


Is main() overloaded in C++? 내 코드입니다 , 그러나이 프로그램은 달릴 때 어떤 문제도 없다.

왜 그럴까요?

+0

이 코드에 대해 불평하지 않는 아주 기본적인 컴파일러가 있어야합니다. –

답변

3

컴파일러에 따라 다릅니다. main에 대한 표준 필수 서명은 다음과 같습니다.

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

그러나이 외에도 컴파일러는 다른 서명도 제공 할 수 있습니다. http://ideone.com/XZp2h

MSVS이 확인되지 않은 외부 뿌려 -

예를 들어, GCC 4.3.4 코드를 거부합니다.

+0

서명이 무엇이든 관계없이 항상 작동하는 것처럼 보이며 컴파일러에서 특별히 처리되는 것은'main'입니까? –

+0

@new_perl 컴파일러에 따라 다릅니다. –

+0

@new_perl 수정 된 답변을 참조하십시오. –

5

main은 특별한 경우이므로 컴파일러에서 특수한 코드를 생성합니다. 일반적으로 main은 —이라는 시작 루틴에서 호출되며 이전 컴파일러에서는 —이 C로 작성되어 있으므로 crt0으로 호출되므로 컴파일러에서 extern "C"으로 선언 된 것처럼 main을 생성합니다. 그러나 그것은 꼭 필요한 것은 아닙니다. 그것은 단지 전형적인 구현입니다.

+0

특정 사례를 증명할만한 참고 자료가 있습니까? –

+0

재미있는 [crt0] (http://en.wikipedia.org/wiki/Crt0)에는 위키 백과 문서가 있습니다. –

+0

일반적인'nm' 출력 :'000000000040dca9 T main'; 그것은 그것이 전혀 엉망이 아닌 것을 확인합니다. –

관련 문제