Warum gcc kann nicht die random () Schnittstelle finden, wenn -std = c99 gesetzt?
Frage
ich "#include <stdlib.h>"
an der Spitze der Quelle.
Beispiel Zusammenstellung:
/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$
Wenn ich -std = c99 ausschalten, wird die Funktion isfinite () kann nicht gefunden werden. So will ich -std = c99 für diesen und anderen Gründen verwenden. Gibt es einen Trick, den ich bin fehlt?
Lösung
man srandom
sagt, dass die Funktion nicht Teil C99 aber ein Teil von POSIX.
Aktivieren _BSD_SOURCE
oder _XOPEN_SOURCE >= 500
oder jeden anderen geeigneten Feature-Test-Makro, das den srandom / Random-Funktion (siehe man feature_test_macros
und man srandom
) erklärt.
Dieses hat gute Chancen, aber Sie müssen die Makros herauszufinden, die implizit dadurch zu / nicht definiert definiert werden durch die Manpages Lesen oben.
/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
Andere Tipps
Ja, es ist ein Trick, den Sie fehlen. Sie -std=gnu99
statt -std=c99
verwenden
-std=c99
#define
s __STRICT_ANSI__
, die /usr/include/features.h
interpretiert als "enable nichts außerhalb des C-Standard by default" (ohne es zu, Sie zumindest bekommen sowohl _SVID_SOURCE
und _BSD_SOURCE
). -std=gnu99
, auf der anderen Seite bedeutet „C99 und GNU-Erweiterungen“ (der gcc Standard wird derzeit -std=gnu89
, seine C89 äquivalent, weshalb man brauchte, um etwas zu geben, die neuen C99-Funktionen zu erhalten).
Als Alternative können Sie das Feature-Test-Makros ermöglichen (wie in @ litb Antwort erwähnt). Mit Blick auf /usr/include/stdlib.h
in meinem System, erwartet er einen von __USE_SVID
, __USE_XOPEN_EXTENDED
oder __USE_BSD
. /usr/include/features.h
sagt mir, dass das Feature-Test-Makros, die diese ermöglichen würden, ist:
-
_SVID_SOURCE
(ermöglicht__USE_SVID
) -
_BSD_SOURCE
(ermöglicht__USE_BSD
) -
_XOPEN_SOURCE
mit einem Wert von mindestens500
(ermöglicht__USE_XOPEN_EXTENDED
) -
_XOPEN_SOURCE_EXTENDED
(auch ermöglicht__USE_XOPEN_EXTENDED
) -
_GNU_SOURCE
(ermöglicht alles, einschließlich der vier Feature-Test-Makros oben)
Für die neuen Programme, bei denen Sie nicht zu besorgt über mögliche Namenskollisionen mit neuen Funktionen von zukünftigen Standards, sowohl -std=gnu99
und -D_GNU_SOURCE
ist eine gute Idee. Es ermöglicht Ihnen, alle neuen Standard-Features und GNU-Erweiterungen verwendet werden, die mit einer Art Rückfall (zum Beispiel autoconf
-Stil Feature-Tests) kombiniert wird, gibt die größte Flexibilität.
Referenzen:
Ich habe Zufallszahl erstellt mit gcc in Codeblöcken unter Ubuntu 9.10 (mit Compiler-Optionen: -std=gnu99 -D_GNU_SOURCE
) Also das für mich gearbeitet:
Dies ist mein Code, den ich hatte, spielte mit:
#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;
}
Dies war nur Idee, natürlich Sie es durch andere Wege erreichen kann ;-) [Zur Installation verwenden Codeblocks: sudo apt-get install build-essential
und dann sudo apt-get install codeblocks
]
Ich benutze rand () und srand (). BTW: Haben Sie vergessen, einen Header oder zwei? Zumindest die zweite Warnung sagt es mir.
Versuchen einschließlich der Datei math.h. (Nur in Erinnerung hatten wir Probleme immer mit Mathematik-Bibliothek und hatten tatsächlich Link zu zwingen, es mit -Im).