簡體   English   中英

在 C 程序中使用 fabs、fmin、fmax 時,如果不包含 math.h,為什么編譯器/鏈接器不報告錯誤?

[英]When using fabs, fmin, fmax in a C program, why doesn't the compiler/linker report an error if math.h is not included?

在 Visual Studio 2013 中編譯 C 程序時,以下結果可能會產生不同的結果:

#include <math.h>

void bar(void) {
    double f = fabs(-1.0);
    /* f is 1.0 */
}

void foo(void) {
    double f = fabs(-1.0);
    /* f is 0 */
}

不包括 math.h的相同片段。 省略包含時,編譯器不會報告錯誤並假定fabs具有以下簽名int fabs()

有沒有強制編譯器將此報告為錯誤甚至警告?

在較舊的 C 標准中,如果函數在聲明之前使用,則假定它接收未知數量的參數(在默認提升下,如printf等可變參數函數)並返回int 編譯器希望在鏈接階段稍后修復符號,因此不應報告錯誤

因此,如果不包含math.h ,編譯器不知道fabs的原型,並且會假設它接受任何類型的參數並返回int 然后當鏈接器真正找到​​一個具有預期名稱的符號並解析為該函數時,但由於函數簽名中不匹配,行為是 undefined 打開所有警告,你會看到一些關於隱式返回類型的信息

在 VS2013 中,即使沒有增加警告級別,我也收到以下警告

Warning 1   warning C4013: 'fabs' undefined; assuming extern returning int

欲了解更多信息,請閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM