默認生成的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()
{
...