Perché non è possibile trovare l'interfaccia gcc random () quando -std = c99 è impostato?
Domanda
Lo faccio "#include <stdlib.h>"
nella parte superiore della sorgente.
Esempio di compilazione:
/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’
ais@xcalibur:t$
Quando spengo -STD = C99, la funzione isFinite () non può essere trovato. Quindi io voglio usare -std = C99 per questo e per altri motivi. C'è qualche trucco che mi manca?
Soluzione
man srandom
dice che la funzione è non parte di C99, ma parte di POSIX.
Attiva _BSD_SOURCE
o _XOPEN_SOURCE >= 500
o qualsiasi altra macro test di funzionalità adatte che dichiara la funzione srandom / random (vedi man feature_test_macros
e man srandom
).
Questo ha buone possibilità, ma è necessario capire le macro che si definiscono / non definito implicitamente in tal modo anche leggendo le pagine di manuale di cui sopra.
/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
Altri suggerimenti
Sì, c'è un trucco si sta perdendo:. Si può usare al posto di -std=gnu99
-std=c99
-std=c99
s #define
__STRICT_ANSI__
, che /usr/include/features.h
interpreta come "non consentono nulla al di fuori dello standard C di default" (senza di essa, si ottiene almeno sia _SVID_SOURCE
e _BSD_SOURCE
). -std=gnu99
, d'altra parte, significa "C99 più GNU estensioni" (il valore predefinito gcc è attualmente -std=gnu89
, la sua C89 equivalente, che è il motivo per cui avevi bisogno di specificare qualcosa per ottenere le nuove funzionalità C99).
In alternativa, è possibile attivare le macro funzione di test (come indicato nella risposta @ litb). Guardando /usr/include/stdlib.h
nel mio sistema, si aspetta una delle __USE_SVID
, __USE_XOPEN_EXTENDED
o __USE_BSD
. /usr/include/features.h
mi dice che le macro funzione di test che consentano questi sono:
-
_SVID_SOURCE
(abilita__USE_SVID
) -
_BSD_SOURCE
(abilita__USE_BSD
) -
_XOPEN_SOURCE
con un valore di almeno500
(consente__USE_XOPEN_EXTENDED
) -
_XOPEN_SOURCE_EXTENDED
(abilita anche__USE_XOPEN_EXTENDED
) -
_GNU_SOURCE
(consente tutto, comprese le macro quattro funzione di test di cui sopra)
Per i nuovi programmi in cui non siete troppo preoccupati per potenziali collisioni nome con nuove funzioni da standard futuri, utilizzando sia -std=gnu99
e -D_GNU_SOURCE
è una buona idea. Esso consente di utilizzare tutte le nuove caratteristiche standard e le estensioni GNU, che, combinati con una sorta di ripiego (per esempio, autoconf
stile caratteristica test) fornisce la massima flessibilità.
References:
Ho creato numeri casuali utilizzando gcc in CodeBlocks sotto Ubuntu 9.10 (con opzioni di compilazione: -std=gnu99 -D_GNU_SOURCE
) quindi questo ha funzionato per me:
Questo è il mio codice che aveva suonato con:
#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;
}
Questa era solo un'idea, naturalmente si può realizzare da altri sensi ;-) [Per installare CodeBlocks utilizzare: sudo apt-get install build-essential
e poi sudo apt-get install codeblocks
]
Io uso rand () e srand (). BTW: Hai dimenticato un'intestazione o due? Almeno il secondo avvertimento me lo dice.
Prova compreso math.h. (Appena ricordato abbiamo sempre avuto problemi con libreria matematica e ha dovuto forzare realtà collegamento con -lm).