¿Por qué no se puede encontrar el gcc de interfaz aleatorio () cuando -std = c99 se fija?

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

  •  05-09-2019
  •  | 
  •  

Pregunta

hago "#include <stdlib.h>" en la parte superior de la fuente.

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’
ais@xcalibur:t$ 

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

¿Fue útil?

Solución

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

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

Éste tiene buenas posibilidades, pero hay que averiguar las macros que se definen / no definido implícitamente con ello también mediante la lectura de las páginas de manual anterior.

/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

Otros consejos

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

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

Como alternativa, puede habilitar las macros de prueba de funciones (como se menciona en la respuesta de @ litb). En cuanto a /usr/include/stdlib.h en mi sistema, se espera que 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. Se le permite utilizar todas las nuevas características estándar y extensiones de GNU, lo que combinado con algún tipo de retroceso (por ejemplo, autoconf al estilo de las pruebas de función) proporciona la mayor flexibilidad.

Referencias:

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 que había jugado 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;
}

Esto fue sólo 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]

utilizo rand () y srand (). Por cierto: ¿Se le olvidó un encabezado o dos? Por lo menos la segunda advertencia dice así.

Trate incluyendo math.h. (Acabo de recordar que siempre ha tenido problemas con la biblioteca matemática y tuvo que forzar realidad enlace con -lm).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top