2015-09-26 95 views
5

任何人都知道爲什麼這個c程序編譯和使用math.h的sqrt?Gcc使用sqrt不包括math.h

這將輸出2.236068

的main.c

#include <stdio.h> 
#include "math_utils.h" 

int main(void){ 
    printf("%f\n", sqrt(5)); 
    return 0; 
} 

math_utils.h

#ifndef MATH_UTILS_Hs 
#define MATH_UTILS_Hs 

double sqrt(double number){ 
    return number + 5; 
} 

#endif // MATH_UTILS_Hs 
我目前在Windows上使用MinGW的GCC

+1

GCC有一個內置的'sqrt'函數,它可能會用對它的內建函數的調用來代替你的調用。既然你定義了這個函數,它應該真的使用你的定義,也許是GCC中的一個錯誤?你使用的是什麼版本的GCC? –

+0

我目前使用4.8.3,我試圖刪除math_utils.h,它會給我這個錯誤'main.c:5:18:警告:不兼容隱含聲明的內置函數'sqrt'[默認情況下啓用]' – Snippet

+0

@JoachimPileborg我相信gcc認爲,無論對已識別函數的定義是否在範圍內,它都會做gcc認爲函數應該做的事情。 – fuz

回答

9

GCC進行優化的地方希望標準庫函數的行爲與標準sa類似ys將呼叫轉換爲C標準庫,轉換爲更高效的機器碼。例如,gcc很可能會爲您的sqrt()調用發出單個fsqrt指令,根本不會調用您的定製sqrt()

您可以通過提供​​來關閉所有已識別功能的優化,或者通過提供-fno-builtin-function來僅關閉function的優化來關閉此行爲。例如,-fno-builtin-sqrt會使gcc兌現您的非標準sqrt()

+0

你我們是正確的伴侶,它的工作原理。感謝您的解釋。 – Snippet

+1

@Snippet對我而言,這是一種享受。 – fuz