2009-02-22 7 views
17

Io faccio "#include <stdlib.h>" nella parte superiore della sorgente.Perché gcc non può trovare l'interfaccia random() quando è impostato -std = c99?

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’ 
[email protected]:t$ 

quando spengo -STD = C99, la funzione isFinite() non può essere trovato. Quindi voglio usare -std = c99 per questo e altri motivi. C'è qualche trucco che mi manca?

risposta

14

man srandom indica che la funzione è non parte di C99 ma parte di POSIX.

Attivare _BSD_SOURCE o _XOPEN_SOURCE >= 500 o qualsiasi altra macro prova caratteristica adatto che dichiara la funzione casuale srandom/(vedi man feature_test_macros e man srandom).

Questo ha buone probabilità, ma è necessario capire i macro che sono definiti/non definiti implicitamente in tal modo anche leggendo le pagine di manuale 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 
-1

Io uso rand() e srand(). A proposito: hai dimenticato un'intestazione o due? Almeno il secondo avvertimento mi dice così.

Provare a includere math.h. (Ho appena ricordato che abbiamo sempre avuto problemi con la libreria matematica e abbiamo dovuto forzare il link con -lm).

+0

ho dovuto votare su questa risposta dal corretto colpo di testa sono stati inclusi (entrambi stdlib e matematica). Il trucco stava definendo la macro. Grazie per la risposta! – SetJmp

+0

Non ho visto che hai citato math.h – dirkgently

+0

In totale C noob, ho apprezzato la menzione di 'srand' almeno. Grazie! – jocull

12

Sì, c'è un trucco ti manca: è possibile utilizzare al posto di -std=gnu99-std=c99.

-std=c99#define s __STRICT_ANSI__, che /usr/include/features.h interpreta come "non attivare 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 plus GNU extensions" (l'impostazione predefinita di gcc è attualmente -std=gnu89, l'equivalente C89, motivo per cui è necessario specificare qualcosa per ottenere le nuove funzionalità di C99).

In alternativa, è possibile abilitare i macro test di funzionalità (come indicato nella risposta di @ litb). Guardando a /usr/include/stdlib.h nel mio sistema, si aspetta uno di __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 almeno 500 (abilita __USE_XOPEN_EXTENDED)
  • _XOPEN_SOURCE_EXTENDED (abilita anche __USE_XOPEN_EXTENDED)
  • _GNU_SOURCE (Consente tutto, comprese le quattro funzionalità macro di prova 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.Ti consente di utilizzare tutte le nuove funzionalità standard e le estensioni GNU, che combinate con una sorta di fallback (ad esempio, i test delle funzionalità di stile) offrono la massima flessibilità.

Riferimenti:

0

realizzati da me 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 con cui ho giocato:

#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; 
} 

Questo è stato solo 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]

Problemi correlati