last compiler c gcc random c99 c89

compiler - c11 vs c99



¿Por qué no puede gcc encontrar la interfaz aleatoria() cuando está configurado-std=c99? (4)

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

Compilación de ejemplo:

/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 función isfinite () no se puede encontrar. Entonces quiero usar -std = c99 por esta y otras razones. ¿Hay algún truco que me falta?


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

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


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

Active _BSD_SOURCE o _XOPEN_SOURCE >= 500 o cualquier otra macro de prueba de características adecuada que declare la función srandom / random (vea man feature_test_macros y man srandom ).

Este tiene buenas posibilidades, pero necesita 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


Sí, hay un truco que te falta: puedes usar -std=gnu99 lugar de -std=c99 .

-std=c99 #define s __STRICT_ANSI__ , que /usr/include/features.h interpreta como "no habilita nada fuera del estándar C de forma predeterminada" (sin él, obtiene al menos tanto _SVID_SOURCE como _SVID_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). Al mirar /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 características que las habilitarían son:

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

Para los nuevos programas en los que no está demasiado preocupado por posibles colisiones de nombres con nuevas funciones de estándares futuros, usar both -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, pruebas de características de estilo autoconf ) brinda la mayor flexibilidad.

Referencias


-std=gnu99 -D_GNU_SOURCE números aleatorios usando gcc en CodeBlocks en Ubuntu 9.10 (con las 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; }

Esta fue solo una idea, por supuesto que puedes lograrlo de otra manera ;-) [Para instalar CodeBlocks usa: sudo apt-get install build-essential y luego sudo apt-get install codeblocks ]