실행이 C++로 시작하는 곳에서 말해주십시오. 대답이 "main"에서 이루어지기를 바랍니다.실행 시작
그러면 어떨까요?
class abc
{
public:
abc()
{
cout<<"hello";
}
};
const abc obj;
int main()
{
cout<<"Main";
}
출력 :
helloMain
정교한하시기 바랍니다.
실행이 C++로 시작하는 곳에서 말해주십시오. 대답이 "main"에서 이루어지기를 바랍니다.실행 시작
그러면 어떨까요?
class abc
{
public:
abc()
{
cout<<"hello";
}
};
const abc obj;
int main()
{
cout<<"Main";
}
출력 :
helloMain
정교한하시기 바랍니다.
귀하의 의견에서 다른 답변에 이르기까지, 10,000 피트보기가 이해를 돕는 것처럼 들립니다.
응용 프로그램 시작과 관련된 정확한 단계는 OS, 컴파일러 및 프로그래밍 언어에 따라 다르지만 "일반"프로세스는 본질적으로 동일합니다. 파일 기술자, 환경 변수 :
int __entry(int argc, char *argv[])
{
// configure standard I/O streams, threading tables, & other utilities
initialize_c_runtime();
// run the constructors for all static objects
initialize_static_cplusplus_objects();
// Now, finally, after *all* that we execute the 'main' function
return main(argc, argv);
}
고마워요 :) 매우 도움이됩니다. – Sadique
main
이 호출되기 전에 전역 변수가 만들어지고 생성자가 호출됩니다. 영업 이익의 의견에
답변 :
당신이 작성한 코드보다 깊이 파고하려는 경우, main
전에 일어나는 일이있다이있는 나 자신이 명확한 그림이없는, 호출됩니다. 우리가 작성한 코드에 대해 이야기하고 있습니다. 여기서 엔트리 포인트는 전역 변수를 초기화 한 후에 호출되는 main
함수입니다. 클래스 인스턴스의 초기화는 생성자를 호출하는 것을 의미합니다.
는 따라서 짧은에, 라인 const abc obj;
가 호출되는 main
전에 (라고 인쇄 문을 그것의 기본 생성자) 초기화 유형 abc
의 전역 변수를 만듭니다. 따라서 출력 helloMain
@strut 업데이트를 참조하십시오 – Amarghosh
의 const 변수로 obj
을 선언했습니다. 변수 obj
은 프로그램이 컴파일러에서 생성 한 코드에 의해 실행을 시작하기 전에 기본값으로 지정됩니다. 이 코드는 기본 생성자를 호출하여 abc
유형의 기본 객체를 만들고 obj
에 할당합니다.
정적 초기화를 제쳐두고두고 실행이 main()
부터 시작한다고 가정하는 것이 맞습니다.
obj
은 글로벌 개체이므로 main
이 실행되기 전에 인스턴스화됩니다. 다른 전역 변수와 같습니다. 즉, 정수 변수를 전역 변수로 선언하면 가비지 값이 아닌 0이 포함됩니다. 따라서 객체가 인스턴스화되고 생성자가 호출되어 hello
문자열이 인쇄됩니다.
응용 프로그램이 main에서 시작하지 않습니다.
MyApp.exe의 wmain (INT는 argc = 0x00000001, wchar_t를 * * 변수는 argv = 0x00364d68) 라인! VS2005로 컴파일 (콘솔 응용 프로그램, 유니 코드 버전) 주요의 시작부터 약간의 스택 스냅 샷은 다음과 67 C++
myapp.exe!__tmainCRTStartup() Line 594 + 0x17 bytes [email protected]() + 0x23 bytes
사용자 모드에서 새로운 프로세스 컨텍스트에서 실행하는 것을 할 수있는 첫 번째 함수는 Win32 레벨 함수이다 BaseProcessStart이다. 바이너리 이미지 자체의 다양한 데이터 섹션을 사용하여 다양한 초기화 프로그램 (예 : obj 같은 글로벌 생성자)을 실행하는 CRT 수준의 mainCRTStartup을 호출합니다. 사실, 여러분은 여러분의 ctor에 중단 점을 설정하고 직접 볼 수 있습니다 :
myapp.EXE! '동적 초기화 for'obj' '()
msvcr80.dll! _initterm (...)
MyApp.exe의! __ tmainCRTStartup()
(일부 서식 지정에 어려움이 있음) initterm은 전역 개체를 반복하고 해당 생성자를 호출하는 함수입니다.
스택은 다른 플랫폼과 컴파일러 (그리고 심지어 VS에서는 MFC 앱과 매우 다름)에서 다르게 보일 수 있지만 아이디어는 항상 동일합니다. 런타임은 이진 이미지 정보를 사용하여 전역 객체를 초기화합니다 전에 자신의 main이 입력됩니다.
단지 컴파일 된 모든 언어에는 작성한 첫 번째 명령문보다 먼저 실행되는 코드가 있습니다. –