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.
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.
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%Sie müssen gcc mitteilen, dass Sie C99 wollen, und dass Sie in libm verlinken möchten:
%Vor%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'?
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.
Tags und Links c gcc compiler-warnings