Pourquoi ne peut-gcc trouver l'interface aléatoire () lorsque std = c99 est réglé?
Question
Je fais "#include <stdlib.h>"
en haut de la source.
Exemple de compilation:
/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$
Quand j'éteins C99 = -std de la fonction isfinite () ne peut pas être trouvé. Donc, je ne veux utiliser std = c99 pour cela et d'autres raisons. Est-il un truc que je suis absent?
La solution
man srandom
dit que la fonction est pas de C99 mais une partie de POSIX.
Activer _BSD_SOURCE
ou _XOPEN_SOURCE >= 500
ou tout autre macro de test de fonctionnalité appropriée qui déclare la fonction srandom / aléatoire (voir man feature_test_macros
et man srandom
).
Celui-ci a de bonnes chances, mais vous devez comprendre les macros qui sont définies / non défini implicitement de ce fait trop en lisant les pages de manuel ci-dessus.
/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
Autres conseils
Oui, il y a un truc qui vous manque:. Vous pouvez utiliser -std=gnu99
au lieu de -std=c99
-std=c99
#define
s __STRICT_ANSI__
, qui /usr/include/features.h
interprète comme « ne permettent pas de quoi que ce soit en dehors de la norme C par défaut » (sans elle, vous obtenez au moins deux _SVID_SOURCE
et _BSD_SOURCE
). -std=gnu99
, d'autre part, des moyens « C99 plus des extensions GNU » (la valeur par défaut de gcc est actuellement -std=gnu89
, son équivalent C89, ce qui est la raison pour laquelle vous avez besoin de préciser quelque chose pour obtenir les nouvelles fonctionnalités C99).
Comme alternative, vous pouvez activer les macros de test de fonctionnalités (comme mentionné dans la réponse de @ litb). En regardant /usr/include/stdlib.h
dans mon système, il attend un des __USE_SVID
, __USE_XOPEN_EXTENDED
ou __USE_BSD
. /usr/include/features.h
me dit que les macros de test de fonctionnalités permettant à ces sont:
-
_SVID_SOURCE
(permet__USE_SVID
) -
_BSD_SOURCE
(permet__USE_BSD
) -
_XOPEN_SOURCE
avec une valeur d'au moins500
(permet__USE_XOPEN_EXTENDED
) -
_XOPEN_SOURCE_EXTENDED
(permet également__USE_XOPEN_EXTENDED
) -
_GNU_SOURCE
(permet tout, y compris les quatre macros de test de fonctionnalités ci-dessus)
Pour les nouveaux programmes où vous n'êtes pas trop préoccupé par les collisions de noms potentiels avec de nouvelles fonctions par rapport aux normes futures, utilisant à la fois -std=gnu99
et -D_GNU_SOURCE
est une bonne idée. Il vous permet d'utiliser toutes les nouvelles fonctionnalités standard et des extensions GNU, qui combiné avec une sorte de repli (par exemple, tests de fonctionnalités de style autoconf
) donne la plus grande flexibilité.
Références:
- Options de contrôle C Dialect
- fonction test macros
J'ai créé des nombres aléatoires avec gcc dans CodeBlocks sous Ubuntu 9.10 (avec des options du compilateur: -std=gnu99 -D_GNU_SOURCE
) Donc, cela a fonctionné pour moi:
Ceci est mon code j'avais joué avec:
#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;
}
Ce fut seule idée, bien sûr, vous pouvez l'accomplir par d'autres moyens ;-) [Pour installer CodeBlocks utiliser: sudo apt-get install build-essential
puis sudo apt-get install codeblocks
]
J'utilise rand () et srand (). BTW: Vous avez oublié un en-tête ou deux? Au moins le deuxième avertissement me le dit.
Essayez d'inclure math.h. (Il suffit de rappeler nous avons toujours eu des problèmes avec la bibliothèque de mathématiques et a dû forcer en fait le lien avec -lm).