Pourquoi ne peut-gcc trouver l'interface aléatoire () lorsque std = c99 est réglé?

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

  •  05-09-2019
  •  | 
  •  

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?

Était-ce utile?

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 #defines __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 moins 500 (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:

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top