2015-09-26 13 views
5

Ktoś wie, dlaczego ten program c kompiluje i używa sqrt z math.h?Gcc używa sqrt bez włączania math.h

to byłoby wyjście 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 

Obecnie używam MinGW GCC na Windows

+1

GCC ma wbudowaną funkcję 'sqrt', prawdopodobnie zastępuje połączenie wywołaniem wbudowanej funkcji. Skoro definiujesz tę funkcję, to naprawdę powinieneś użyć swojej definicji, może błędu w GCC? Jakiej wersji GCC używasz? –

+0

Jestem obecnie przy użyciu 4.8.3, próbowałem usunąć math_utils.h i to dałoby mi ten błąd 'main.c: 5: 18: warning: niekompatybilna niejawna deklaracja wbudowanej funkcji 'sqrt' [domyślnie włączona]' – Snippet

+0

@JoachimPileborg Wierzę, że gcc zakłada, że ​​jakakolwiek definicja uznanej funkcji jest w zakresie, zawsze będzie robiła to, co gcc uważa za funkcję. – fuz

Odpowiedz

9

gcc wykonuje optymalizację gdzie oczekuje, że standardowe funkcje biblioteki zachowują się jak standardowe sa ys, aby przekształcić wywołania w standardową bibliotekę C w bardziej wydajny kod maszynowy. Na przykład, prawdopodobne jest, że gcc wysyła pojedynczą instrukcję fsqrt dla twojego połączenia sqrt(), nigdy nie wywołując w ogóle twojego niestandardowego sqrt().

Możesz wyłączyć to zachowanie, podając -fno-builtin, aby wyłączyć tę optymalizację dla wszystkich rozpoznanych funkcji lub podając -fno-builtin-function, aby wyłączyć tę optymalizację tylko dla function. Na przykład -fno-builtin-sqrt spowoduje, że gcc uzna Twoje niestandardowe sqrt().

+0

jesteś naszym partnerem, to działa. Dziękuję za wyjaśnienie. – Snippet

+1

@Snippet To dla mnie przyjemność. – fuz

Powiązane problemy