2009-02-22 12 views
17

Robię "#include <stdlib.h>" u góry źródła.Dlaczego gcc nie może znaleźć interfejsu random() po ustawieniu opcji -std = c99?

Przykład zestawienie:

/usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
In file included from f8.c:7: 
ctype-cmp.c: In function ‘randomized’: 
ctype-cmp.c:48: warning: implicit declaration of function ‘random’ 
ctype-cmp.c: In function ‘main’: 
ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’ 
[email protected]:t$ 

Gdy wyłączy -std = C99 isFinite funkcja() może nie występować. Więc chcę użyć -std = c99 z tego i innych powodów. Czy brakuje mi jakiejś sztuczki?

Odpowiedz

14

man srandom mówi, że funkcja jest nie część C99, ale część POSIX.

Aktywacja _BSD_SOURCE lub _XOPEN_SOURCE >= 500 lub inny odpowiedni funkcji testowej makra deklaruje się srandom/funkcji losowej (patrz man feature_test_macros i man srandom).

Ten ma dobre szanse, ale musisz zrozumieć makra, które zostały zdefiniowane/nie zdefiniowane w sposób dorozumiany również przez przeczytanie powyższych stron podręcznika.

/usr/bin/colorgcc -std=c99 -D_XOPEN_SOURCE=600 -fgnu89-inline -g -Wall 
    -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
-1

Używam rand() i srand(). BTW: Czy zapomniałeś nagłówka lub dwóch? Przynajmniej drugie ostrzeżenie mi to mówi.

Spróbuj załączyć math.h. (Pamiętałem, że zawsze mieliśmy problemy z biblioteką matematyczną i musieliśmy wymusić na niej link z -lm).

+0

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

+0

Nie widziałem, żebyś wspominał math.h – dirkgently

+0

Jako totalny C noob, doceniam przynajmniej wzmiankę o 'srand'. Dzięki! – jocull

12

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:

0

mojego autorstwa liczb losowych za pomocą gcc w CodeBlocks pod Ubuntu 9.10 (z opcjami kompilatora: -std=gnu99 -D_GNU_SOURCE), więc ten pracował dla mnie:

To jest mój kod, z którym bawiłem się:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
enum computer {keyboard, CPU, screen, printer}; 
int main(void) 
{ 
    enum computer comp; 
    time_t casovac; 
    comp = CPU; 
    srand(&casovac); 
    printf("%d", rand()); 
    return 0; 
} 

był to tylko pomysł, oczywiście można osiągnąć przez innych sposobów ;-) [Aby zainstalować CodeBlocks użyć: sudo apt-get install build-essential a następnie sudo apt-get install codeblocks]

Powiązane problemy