PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : implicit declaration NUR ein Warning ???



Siro
09.05.2016, 11:25
Hallo zusammen,
ich wundere mich grad über einem "WARNING" welchen ich jedoch als "ERROR" interpretieren würde.

Ich habe eine Berechnung, die unter anderem eine Funktion aufruft um einen weiteren Wert zu berechnen,
diese Funktion habe ich jedoch testweise ausgeklammert.

Nun "warnt" mich lediglich der GNU Compiler mit "implicit declaration of funnction xxxx"

Was mich jetzt daran wundert, ist das ich ein Compilat bzw. Hexfile bekomme und mich frage, was er da wohl für einen Code eingesetzt hat.

Wenn eine aufgerufene Funktion nicht existiert, sollte das nicht ein ERROR sein ?

Dem ARM-Compiler wird -Wall übergeben.

Nun die Frage: warum nur Warning, ein sinnvoller Code kann doch nicht generiert werden ?

bzw. kann man solche Warnings evtl. als "Error" behandeln ? einen Warning wird ja schnell mal ignoriert ;)


Ich danke Euch schonmal für Infos
Siro

HaWe
09.05.2016, 12:19
ohne Code kann man nur spekulieren - es kommt z.B. drauf an, was du mit dem Funktionswert der nicht existenten Funktion machst:
wird er gar nicht weiterverwendet, schmeißt ihn die Code-Optimierung u.U. von ganz alleine komplett raus, und dann ist es ja kein Fehler... 8-)

Aber wie gesagt: für genauere Aussagen braucht man den genauen Code...

witkatz
09.05.2016, 13:41
bzw. kann man solche Warnings evtl. als "Error" behandeln ?

Das lässt sich bestimmt über ein #pragma steuern und sollte im User Manual deines Compilers beschrieben sein.
Mit GCC habe ich zwar nichts am Hut, aber bei XC8 nachgeschaut und ausprobiert:
#pragma warning error 361
beispielsweise macht aus warning: (361) function declared implicit int
einen error: (361) function declared implicit int

Gruß witkatz


- - - Aktualisiert - - -

Hier (https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas) und hier (https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html) was gefunden zu GCC: es könnte so gehen:
#pragma GCC diagnostic error "-Wimplicit"

Siro
09.05.2016, 15:01
erst einmal vielen Dank

@HaWe: Das gibt Sinn, wenn der Compiler den Code nicht benötigt und rausschmeisst, ist ein Warning auch völlig ausreichend.
ich glaube daran liegt es, ich probiere grad noch etwas rum

@Witkatz:
ja, bei den PIC-Compiler XC8 geht das super, habe ich eben probiert:


#pragma warning error 373 /* implicit signed to unsigned conversion erzeugt nun einen error (373) */

Die Warning/Error Steuerung beim GNU habe ich leider noch nicht verstanden, trotz deinem LINK.

botty
09.05.2016, 15:17
Es ist 'nur' eine Warnung weil man Funktionen und deren Parameter auch nur mit Namen also ohne Datentypen deklarieren darf. Das ist noch ein Relikt aus der K&R-Steinzeit.
Wenn man das ungeschickter Weise macht, dann werden Funktionsaufrufe standardmäßig mit 'int' für Rückgabewert und Parametern generiert und das kann sich dann beißen, wenn Deine Implementierung intern ganz andere Datentypen erwartet. Sich an dieser Stelle auf Optimierungen zu verlasssen, ist keine gute Idee.
Letzten Endes mußt Du alle Aufrufe der Funktion, die Du gerade nicht benutzen willst, auskommentieren und nicht einfach nur die Deklaration und/oder Definition. Irgendwo in Deiner Compileunit ist noch ein Aufruf drin, der Dir diese Warnung erzeugt.

Grüße
Chris

witkatz
09.05.2016, 15:17
Die Warning/Error Steuerung beim GNU habe ich leider noch nicht verstanden, trotz deinem LINK.
Es sind zwei Links ;-)
Hast du mit #pragma GCC (http://www.rn-wissen.de/index.php/Gcc) diagnostic error "-Wimplicit" probiert?

Siro
09.05.2016, 15:37
sorry witkatz, es sind tatsächlich 2 Links.....;)

und jetz funktioniert es auch so wie ich das wollte:

#pragma GCC diagnostic error "-Wimplicit" ist genau die richtige Lösung

jetzt gibt es auch den gewollten Fehler

../src/Regulation.c:871:42: error: implicit declaration of function 'h_flow' [-Werror=implicit-function-declaration]

Damit ist mein Problemchen gelöst.
Supi, ich danke euch Allen.

Siro



Letzten Endes mußt Du alle Aufrufe der Funktion, die Du gerade nicht benutzen willst, auskommentieren und nicht einfach nur die Deklaration und/oder Definition. Irgendwo in Deiner Compileunit ist noch ein Aufruf drin, der Dir diese Warnung erzeugt.
Das ist auch ein guter Hinweis botty, ich danke Dir.