2015-09-20 69 views
2

我用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?

+1

您的計算機上有CRT源代碼,請查看vc/crt/src目錄。請注意註釋:「默認matherr不執行任何操作並返回0」。 –

回答

1

matherr如果檢測到數學異常,應該從各種數學函數中調用。默認實現什麼都不做。在某些平臺上,可以用用戶定義的代碼(ELF系統上的「函數插入」)有選擇地替換C庫函數,這樣就可以實現自己的數學錯誤處理程序。 AFAIK,這對於Windows上的可移植可執行文件(PE)是不可行的。我想matherr是僅出於兼容性原因的CRT的一部分。