Tak, istnieje trik brakuje: można używać -std=gnu99
zamiast -std=c99
.
-std=c99
#define
s __STRICT_ANSI__
, który /usr/include/features.h
interpretuje jako „nic poza standard C domyślnie nie pozwalają” (bez niego, można dostać co najmniej zarówno _SVID_SOURCE
i _BSD_SOURCE
). -std=gnu99
, z drugiej strony, oznacza "C99 plus rozszerzenia GNU" (domyślnie gcc to obecnie -std=gnu89
, jego odpowiednik C89, dlatego trzeba było podać coś, aby uzyskać nowe funkcje C99).
Alternatywnie można włączyć makra testów właściwości (jak wspomniano w odpowiedzi @ litb). Patrząc na /usr/include/stdlib.h
w moim systemie, oczekuje jednego z __USE_SVID
, __USE_XOPEN_EXTENDED
lub __USE_BSD
. /usr/include/features.h
mówi mi, że makra testów cecha które umożliwiają one:
_SVID_SOURCE
(umożliwia __USE_SVID
)
_BSD_SOURCE
(umożliwia __USE_BSD
)
_XOPEN_SOURCE
o wartości co najmniej 500
(umożliwia __USE_XOPEN_EXTENDED
)
_XOPEN_SOURCE_EXTENDED
(umożliwia także __USE_XOPEN_EXTENDED
)
_GNU_SOURCE
(Pozwala na wszystko, łącznie z makrami testowych cztery fabularnych powyżej)
Dla nowych programów, w których nie są zbyt zaniepokojeni potencjalnych kolizji nazw z nowych funkcji z przyszłych standardów, wykorzystując zarówno -std=gnu99
i -D_GNU_SOURCE
jest dobrym pomysłem.Umożliwia korzystanie ze wszystkich nowych standardowych funkcji i rozszerzeń GNU, co w połączeniu z pewnym rodzajem zastępstwa (na przykład testami funkcji w stylu autoconf
) zapewnia największą elastyczność.
Referencje:
musiałem dół głosować tę odpowiedź, ponieważ prawidłowy nagłówek zostały włączone (zarówno stdlib i matematyka). Sztuczka polegała na definiowaniu makra. Dzięki za odpowiedzi! – SetJmp
Nie widziałem, żebyś wspominał math.h – dirkgently
Jako totalny C noob, doceniam przynajmniej wzmiankę o 'srand'. Dzięki! – jocull