Wpis z mikrobloga

Coś dziwnego mi się zrobiło z gcc. O.O

Otóż ten program:

#include
#include
int main() {
double d = sqrt(56);
printf("%f\n", d);
return 0;
}
wbrew moim oczekiwaniom nie wymaga już ręcznego dołączania biblioteki matematycznej. Kompiluje się bez błędów i bez ostrzeżeń przy samym

gcc main.c -Wall
. Powiem więcej: nawet po usunięciu obu dyrektyw #include kompiluje się i wykonuje poprawnie, wypisując tylko ostrzeżenia:

main.c: In function ‘main’:

main.c:5:13: warning: incompatible implicit declaration of built-in function ‘sqrt’ [enabled by default]

main.c:6:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]

Od kiedy tak jest? Kompilator gcc tak się teraz zachowuje, czy sobie coś ustawiłem i nie pamiętam? Mam wersję 4.6.3, system Ubuntu 12.04LTS.

#programowanie #jezykc #linux
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

main.c:5:13: warning: incompatible implicit declaration of built-in function ‘sqrt’ [enabled by default]


@Onoki: Przeczytaj uwaznie ten komunikat to bedziesz wiedzial :P
  • Odpowiedz
@Tril: Rozumiem to, ale pytanie brzmi od kiedy tak jest, bo kiedyś tak nie było. :D Już pomijając to usuwanie nagłówków, kiedyś też bezwzględnie wymagało -lm przy kompilacji programu używającego funkcji matematycznych, a teraz już nic, kompletnie. Od pierwszego semestru nie programowałem w C, ale pamiętam że opcja -lm zawsze była wymagana.
  • Odpowiedz
@Onoki: moƶe kompilowałeś z

std=c99
lub

std=c11
domyślnie. Poza tym, kompilator moƶe za wyraƶenie zawierające stałą wstawić stałą: przykład
  • Odpowiedz
Poza tym, kompilator moƶe za wyraƶenie zawierające stałą wstawić stałą


@KrzaQ2: Strzał w dychę! :D

Otóż okazało się, że jest to optymalizacja. Po zamianie 56 na zmienną pobieraną wcześniej za pomocą scanf linker zgłasza "undefined reference to `sqrt'", tak jak to było zawsze. :) Czyli po etapie kompilacji sqrt(56) zostało zamienione na stałą, więc biblioteka matematyczna w ogóle nie musi być dołączana do programu. Nawet nie wiedziałem, że gcc robi
  • Odpowiedz