我用C寫了一個基本的 「Hello World」 程序:樣板CRT功能matherr的要點是什麼?
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
然後,我編譯它在MSVC在命令行這樣的:
cl hello.c /Fd:hello.pdb /Zi /MD /link /NODEFAULTLIB:LIBCMT.LIB
命令行參數基本說「生成一個PDB文件並鏈接到MSVCRT.LIB而不是LIBCMT.LIB」。
然後,我拆解程序,看着不同的樣板/ CRT功能,發現這個在拆卸,這是好奇:
__matherr:
00401550: 33 C0 xor eax,eax
00401552: C3 ret
這基本上是一直在EAX返回0時,它是一個函數調用。根據該函數的the documentation,當存在數學錯誤時返回0,當沒有錯誤時返回非0。
有沒有人有一個答案,爲什麼這個函數,它應該在數學錯誤的情況下返回0,被包含在可執行文件中,並被硬編碼爲總是返回0?
您的計算機上有CRT源代碼,請查看vc/crt/src目錄。請注意註釋:「默認matherr不執行任何操作並返回0」。 –