2009-02-22 8 views
17

Hago "#include <stdlib.h>" en la parte superior de la fuente.¿Por qué no puede gcc encontrar la interfaz aleatoria() cuando se establece -std = c99?

Ejemplo compilación:

/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$ 

Cuando apago -std = c99, la isFinite función() no se puede encontrar. Entonces quiero usar -std = c99 por esta y otras razones. ¿Hay algún truco que me falta?

Respuesta

14

man srandom dice que la función es no parte de C99 pero parte de POSIX.

Active _BSD_SOURCE o _XOPEN_SOURCE >= 500 o cualquier otra prueba macro característica adecuada que declara la función aleatoria srandom/(ver man feature_test_macros y man srandom).

Éste tiene buenas posibilidades, pero debe averiguar las macros que están definidas/no definidas implícitamente al hacerlo leyendo las páginas de manual anteriores.

/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

Uso rand() y srand(). Por cierto: ¿Olvidaste un encabezado o dos? Al menos la segunda advertencia me lo dice.

Intente incluir math.h. (Solo recuerdo que siempre tuvimos problemas con la biblioteca de matemáticas y tuvimos que obligar a vincularlo con -lm).

+0

tuviera que votar en contra de esta respuesta correcta desde el encabezado del fueron incluidos (tanto stdlib y matemática). El truco fue definir la macro. ¡Gracias por la respuesta! – SetJmp

+0

No vi que hubieras mencionado math.h – dirkgently

+0

Como C noob total, aprecié la mención de 'srand' al menos. ¡Gracias! – jocull

12

Sí, hay un truco que se echa en falta: se puede usar en lugar de -std=gnu99-std=c99.

-std=c99#define s __STRICT_ANSI__, que /usr/include/features.h interpreta como "no permitir que nada fuera de la norma C por defecto" (sin ella, se obtiene al menos tanto _SVID_SOURCE y _BSD_SOURCE). -std=gnu99, por otro lado, significa "extensiones C99 plus GNU" (el valor predeterminado de gcc es actualmente -std=gnu89, su equivalente C89, por lo que debe especificar algo para obtener las nuevas características C99).

Como alternativa, puede habilitar las macros de prueba de características (como se menciona en la respuesta de @ litb). Mirando /usr/include/stdlib.h en mi sistema, espera uno de __USE_SVID, __USE_XOPEN_EXTENDED, o __USE_BSD. /usr/include/features.h me dice que las macros de prueba de funciones que permitan a estos son:

  • _SVID_SOURCE (permite __USE_SVID)
  • _BSD_SOURCE (permite __USE_BSD)
  • _XOPEN_SOURCE con un valor de al menos 500 (permite __USE_XOPEN_EXTENDED)
  • _XOPEN_SOURCE_EXTENDED (también permite __USE_XOPEN_EXTENDED)
  • _GNU_SOURCE (Permite todo, incluyendo las macros de prueba de cuatro características anteriores)

Para los nuevos programas en los que usted no está demasiado preocupado por los posibles conflictos de nombres con las nuevas funciones de las futuras normas, utilizando tanto -std=gnu99 y -D_GNU_SOURCE es una buena idea.Le permite usar todas las nuevas características estándar y extensiones de GNU, lo que combinado con algún tipo de respaldo (por ejemplo, autoconf-pruebas de características de estilo) brinda la mayor flexibilidad.

Referencias:

0

que he creado números aleatorios utilizando gcc en CodeBlocks bajo Ubuntu 9.10 (con opciones del compilador: -std=gnu99 -D_GNU_SOURCE) Así que esto funcionó para mí:

Este es mi código con el que había jugado:

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

Esto fue única idea, por supuesto que se puede lograr por otras maneras ;-) [Para instalar CodeBlocks utilizan: sudo apt-get install build-essential y luego sudo apt-get install codeblocks]

Cuestiones relacionadas