默认生成的project会将编译出的函数结尾加上类似于以下的东西:
00412FE8 push edx
00412FE9 mov ecx,ebp
00412FEB push eax
00412FEC lea edx,[ (413000h)]
00412FF2 call @ILT+135(@_RTC_CheckStackVars@8) (41108Ch)
00412FF7 pop eax
00412FF8 pop edx
00412FF9 pop edi
00412FFA pop esi
00412FFB pop ebx
00412FFC mov esp,ebp
00412FFE pop ebp
00412FFF ret
去掉的方法如下:
项目-属性-c/c++ - 代码生成:
基本运行时检查 : 默认值
安全检查: 禁用安全检查(/GS-)
再编译出来就是干净的函数体了!
另外,为了兼容GCC,可以设置:属性-常规-字符集:未设置(默认:unicode)
// 作用: 去掉函数的栈帧代码,纯属吹毛求疵:-)
// 即函数开头的push ebp / mov ebp, esp和结尾的pop ebp / retn
__declspec(naked) //vc2017 x64不支持,只支持x86
void main()
{
...