Perché non è possibile trovare l'interfaccia gcc random () quando -std = c99 è impostato?

StackOverflow https://stackoverflow.com/questions/575350

  •  05-09-2019
  •  | 
  •  

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?

È stato utile?

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=c99s #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 almeno 500 (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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top