在VS2017中,创建一个控制台C++应用:
#include "pch.h"
#include <iostream>
int func()
{
return 1;
}
int v = func();
int main()
{
}
在main()中设置断点,开始调试,调用栈如下:
testCppConsole.exe!main() Line 8 C++
testCppConsole.exe!invoke_main() Line 78 C++
testCppConsole.exe!__scrt_common_main_seh() Line 288 C++
testCppConsole.exe!__scrt_common_main() Line 331 C++
testCppConsole.exe!mainCRTStartup() Line 17 C++
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown
所以程序入口点是mainCRTStartup,最后调用C入口点main(),v的值为1。
现在将 Linker>Advanced>Entry Point 设置为“main”并开始调试,现在调用堆栈为:
> testCppConsole.exe!main() Line 8 C++
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown
所以main()成为程序入口点,此时v的值为0,因为根本不调用CRT init函数,所以不会调用func()。
现在将代码修改为:
#include "pch.h"
#include <iostream>
extern "C" int mainCRTStartup();
extern "C" int entry()
{
return mainCRTStartup();
}
int func()
{
return 1;
}
int v = func();
int main()
{
}
并将 Linker>Advanced>Entry Point 设置为“entry”并开始调试,现在调用堆栈为:
> testCppConsole.exe!main() Line 14 C++
testCppConsole.exe!invoke_main() Line 78 C++
testCppConsole.exe!__scrt_common_main_seh() Line 288 C++
testCppConsole.exe!__scrt_common_main() Line 331 C++
testCppConsole.exe!mainCRTStartup() Line 17 C++
testCppConsole.exe!entry() Line 10 C++
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown
v 将再次为 1。程序入口点是 entry(),它调用 mainCRTStartup(),该函数调用 CRT init 函数,该函数调用 func() 来初始化 v,mainCRTStartup() 最后调用 main()。