Warum meldet Gcc "implizite Deklaration der Funktion 'Runde'"?

Ich habe folgende C Code:

#include <math.h>

int main(int argc, char ** argv)
{
    double mydouble = 100.0;
    double whatever = round(mydouble);

    return (int) whatever;
}

Wenn ich dies zu kompilieren, erhalte ich die Warnungen:

round_test.c: In function ‘main’:
round_test.c:6: warning: implicit declaration of function ‘round’
round_test.c:6: warning: incompatible implicit declaration of built-in function ‘round’

Ich bin mit C rostig, aber ich dachte, dass die # gehören brachte eine Erklärung für round() in den Bereich. Ich habe meine ANSI-Standard (C99 ist die einzige Kopie, die ich habe) überprüft die bestätigt, dass die Round()-Funktion in math.h-Header vorhanden ist. Was fehle ich hier?

Edit: Der Compiler ist GCC 4.3.2 auf Ubuntu (intrepid, IIRC). Gcc -E ausgeführt haben:

$ gcc -E round_test.c | grep round
# 1 "round_test.c"
# 1 "round_test.c"
# 2 "round_test.c" 2
    double whatever = round(mydouble);

die Definition ist nicht so offensichtlich in den Headern gefunden wird.

Kommentar #1

Ich sehe, dass Sie Gcc verwenden.

Gcc verwendet standardmäßig einen Standard C89 ähnlich. Vielleicht möchten "zwingen", verwenden den C99-Standard (die Teile, die es entspricht)

gcc -std=c99 -pedantic ...

Zitat von GCC-Handbuch

GCC bietet standardmäßig einige Erweiterungen zum C Sprache, die in seltenen Fällen im Widerspruch zu der C-standard. Finden Sie unter Erweiterungen zur C Sprachfamilie. Verwendung der oben aufgeführten Optionen -std sperrt diese Erweiterungen, wo sie in mit der C Konflikt-standard-Version ausgewählt. Sie können auch auswählen, eine erweiterte Version der C Sprache explizit mit -std = gnu89 (für C89 mit GNU-Erweiterungen) oder -std = gnu99 (für C99 mit GNU-Erweiterungen). Die Standardeinstellung, wenn keine C Sprache Dialekt Optionen gegeben sind, ist -std = gnu89; Dies wird sich ändern - Std = gnu99 in einer zukünftigen Version, wenn die C99-Unterstützung abgeschlossen ist. Einige Features, die Teil der C99-standard sind, werden als Erweiterungen im C89 Modus akzeptiert.

Kommentar #2

Etwas muss mit Gcc Installation, System-Header oder Kompilierungsoptionen falsch sein.

Versuchen Sie, mit -E. Kompilieren Das wird Ihnen zeigen, welche die Präprozessorausgabe--einschließlich welche Header enthalten sein soll und was in ihnen ist. Auf meinem Ubuntu Linux-System ist es ungefähr 1000 Zeilen der Ausgabe, einschließlich dieser:

extern double round (double __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__));

Kommentar #3

Sie müssen Gcc mitteilen, dass Sie C99, und dass Sie in Libm verknüpfen möchten:

gcc -std=c99 -lm round_test.c

Kommentar #4

Der Code, den Sie eingeben wird sauber auf MacOS X 10.5.8 mit GCC 4.0.1. Wenn stieß mit den Optionen '-Wand - Wextra', es klagt über nicht verwendete Parameter Argc und Argv - nicht materiell.

Haben Sie sah <math.h> auf Ihrem Rechner?

Haben Sie versucht mit Optionen wie '-Stc = c99'?

Kommentar #5

C99 war die Antwort, aber die ganze Geschichte ist ein wenig komplizierter. Der Grund, warum, den ich überhaupt mit diesem gespielt hatte, war, dass ich versuchte, eine Bibliothek für Windows, die seine eigene "optimierte" Definition von round() hatte kompilieren. Ich habe ein Linkerfehler erzählte mir, dass die Definition in mit dem eingebauten, Konflikt damit ich die Definition (und Erklärung) entfernt. Nachdem ich das getan hatte, fing ich an die "implizite Deklaration" Fehlermeldung angezeigt.

Es scheint, dass der Standardmodus für die Kompilierung (ohne die -std = c99-Flag) ist weder konformen C89 noch C99: Wenn es C89 konform waren, in der Lage man sollte, eine individuelle Definition der round() ohne Konflikte und wenn es C99 konform waren die Deklaration in math.h sollte.

Kommentar #6

Sie müssen mit der Mathe-Bibliothek zu verknüpfen. So wenn Sie kompilieren, müssen Sie Hinzufügen der -lm Flagge.

Tags lesen