2013-03-18 4 views

답변

5

이 모든 용어는 순전히 구현 세부 정보입니다. C에는 "반송 주소"또는 "동적 링크"개념이 없습니다. 그것은 "스택"의 개념조차 가지고 있지 않습니다. 대부분 C의 구현에는 이러한 객체가 있고 해당 구현에서는 main에 존재할 수 있습니다. 그러나 이것이 일어날 필요는 없습니다.

희망이 도움이됩니다.

2

함수를 디스 어셈블하면 스택에 반환 값 (대부분 EAX 레지스터가 수행하는 시간 (인텔 x86))이 포함되지 않은 경우가 대부분 있음을 알 수 있습니다. "호출 규칙"을 찾아 볼 수도 있습니다.이 규칙은 모두 컴파일러에 달려 있습니다. C는 언어입니다. 어떻게 기계어로 해석되는지는 '그'사업이 아닙니다.

-1

C/C++에서 main()은 함수처럼 쓰여지지만 하나가 아닙니다. 예를 들어 main()을 호출 할 수 없으면 여러 개의 프로토 타입을 사용할 수 있습니다 (C!는 불가능 함). return이 무엇이든지간에 운영 체제로 전달되고 프로그램이 종료됩니다.

개별 C 구현은 균일 성을 위해 "외부"에서 호출 된 함수처럼 main()을 처리 할 수 ​​있지만 아무도 그렇게하지 못하게합니다 (또는 아무에게도 알리지 않고 다른 형식으로 전환하지 못하게 함). C를 구현하는 전통적인 방법이 있지만 아무도 그런 식으로하지 않아도됩니다. 이는 일반적인 아키텍처에서 단순한 방법 일뿐입니다.

+0

"C/C++"와 같은 언어가 없습니다. C에서'main'을 호출하는 것은 완벽하게 합법적입니다. –

+0

@R, 그렇지 않습니다. _usually_ 작품 (많은 재미있는 oneliners이 악용),하지만 그것은 표준에 의해 전혀 허용되지 않습니다. – vonbrand

+1

예. C와 C++을 혼동스럽게합니다. C++은'main'을 호출하는 것을 금지합니다. 왜냐하면'main' (전통적인 cfront 접근법)의 시작 부분에 주입 된 특별한 코드를 통해 전역 ctors가 구현되는 구현을 허용하기 때문입니다. C는'main'에 아무런 제한을 두지 않습니다. 외부 연결이있는 일반적인 함수이므로 별도로 지정하지 않는 한 호출해야합니다. –

0

이것은 구현에 따라 다르지만 gcc로 컴파일 된 C 프로그램을 살펴 보는 것이 좋습니다. objdump -d executable을 실행하면 해체 된 것을 볼 수 있으며 main()의 동작을 볼 수 있습니다. 다음은 그 예이다 : 당신은 그 메인이 정상적으로 반환에 일정한 기능을 유사하게 작동 볼 수

08048680 <_start>: ... 8048689: 54 push %esp 804868a: 52 push %edx 804868b: 68 a0 8b 04 08 push $0x8048ba0 8048690: 68 30 8b 04 08 push $0x8048b30 8048695: 51 push %ecx 8048696: 56 push %esi 8048697: 68 f1 88 04 08 push $0x80488f1 804869c: e8 9f ff ff ff call 8048640 <__l[email protected]> 80486a1: f4 hlt ... 080488f1 <main>: 80488f1: 55 push %ebp 80488f2: 89 e5 mov %esp,%ebp 80488f4: 57 push %edi 80488f5: 56 push %esi 80488f6: 53 push %ebx ... 8048b2b: 5b pop %ebx 8048b2c: 5e pop %esi 8048b2d: 5f pop %edi 8048b2e: 5d pop %ebp 8048b2f: c3 ret

. 실제로 linux base 설명서를 보면 에서 볼 수있는 __libc_start_main에 대한 호출에 실제로는 main이 있어야 정상적인 기능을 수행 할 수 있습니다.