Warum meldet gcc "implizite Deklaration der Funktion 'round'"?

8

Ich habe den folgenden C-Code:

%Vor%

Wenn ich das kompiliere, bekomme ich die Warnungen:

%Vor%

Ich bin rostig mit C, aber ich dachte, dass das # include eine Deklaration für round () in den Geltungsbereich gebracht hat. Ich habe meinen ANSI-Standard überprüft (C99 ist die einzige Kopie, die ich habe), die bestätigt, dass die round () - Funktion in der Kopfzeile math.h vorhanden ist. Was fehlt mir hier?

Bearbeiten: Der Compiler ist GCC 4.3.2 auf Ubuntu (intrepid, IIRC). Laufendes gcc -E gibt:

%Vor%

, so dass die Definition offensichtlich nicht in den Headern gefunden wird.

    
Tim Martin 23.11.2009, 15:21
quelle

6 Antworten

17

Ich sehe, dass Sie gcc verwenden.

Standardmäßig verwendet gcc einen ähnlichen Standard wie C89. Sie können es "zwingen", um den C99-Standard (die Teile, die es entspricht) zu verwenden

%Vor%

Zitat aus GCC-Handbuch

  

Standardmäßig stellt GCC einige zur Verfügung   Erweiterungen der C-Sprache, die auf   seltene Gelegenheiten Konflikt mit dem C   Standard. Siehe Erweiterungen zum C   Sprachfamilie. Verwendung der -std   Die oben aufgeführten Optionen werden deaktiviert   Diese Erweiterungen, wo sie sich widersprechen   mit der C-Standardversion ausgewählt.   Sie können auch eine erweiterte auswählen   Version der C-Sprache explizit   mit -std = gnu89 (für C89 mit GNU   Erweiterungen) oder -std = gnu99 (für C99   mit GNU-Erweiterungen). Der Standardwert, wenn   Keine C-Sprache Dialekt-Optionen sind   gegeben, ist -std = gnu89; Das wird sich ändern   to -std = gnu99 in einer zukünftigen Version   wenn die C99-Unterstützung abgeschlossen ist. Etwas   Funktionen, die Teil des C99 sind   Standard werden als Erweiterungen in akzeptiert   C89-Modus.

    
pmg 23.11.2009, 15:27
quelle
3

Etwas stimmt nicht mit Ihrer GCC-Installation, den Systemheadern oder den Kompilierungsoptionen.

Versuchen Sie das Kompilieren mit -E. Das zeigt Ihnen, was die Präprozessor-Ausgabe - einschließlich der Header und was drin ist - zeigt. Auf meinem Ubuntu Linux-System sind es etwa 1000 Zeilen, einschließlich:

%Vor%     
Jason Orendorff 23.11.2009 15:26
quelle
3

Sie müssen gcc mitteilen, dass Sie C99 wollen, und dass Sie in libm verlinken möchten:

%Vor%     
Douglas Leeder 23.11.2009 15:29
quelle
0

Der eingegebene Code wird unter MacOS X 10.5.8 mit GCC 4.0.1 sauber kompiliert. Wenn sie mit den Optionen '-Wall -Wextra' angestoßen wird, beschwert sie sich über nicht verwendete Parameter argc und argv - nicht Material.

Haben Sie in <math.h> auf Ihrem Computer nachgesehen?

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

    
Jonathan Leffler 23.11.2009 15:27
quelle
0

C99 war die Antwort, aber die ganze Geschichte ist etwas komplizierter. Der Grund, warum ich damit gespielt habe, war, dass ich eine für Windows geschriebene Bibliothek kompilieren wollte, die ihre eigene "optimierte" Definition von round () hatte. Ich habe einen Linker-Fehler bekommen, der mir mitteilt, dass die Definition mit dem eingebauten Konflikt in Konflikt steht, also habe ich die Definition (und die Deklaration) entfernt. Sobald ich das getan hatte, fing ich an, den "impliziten Erklärungsfehler" zu bekommen.

Es scheint, dass der Standard-Kompiliermodus (ohne das Flag -std = c99) weder C89 noch C99 entspricht: Wenn es C89 konform wäre, sollten Sie in der Lage sein, eine benutzerdefinierte Definition von round () ohne Konflikte anzugeben, und wenn es war übereinstimmend C99 sollte die Deklaration in math.h sein.

    
Tim Martin 23.11.2009 15:55
quelle
-2

Sie müssen mit der Mathematikbibliothek verlinken. Achten Sie also beim Kompilieren darauf, das Flag -lm hinzuzufügen.

    
lorenzog 23.11.2009 15:33
quelle

Tags und Links