Hallo miteinander, ich habe ein Problem mit dem AVR Studio 6. Mein Programm ist im Aufbau und der erste Code läuft schon auf der Hardware. Jedoch fällt mir gerade auf - dass ich neue Funktionen - die nur in der *.c Datei definiert sind (und nicht in der*.h) problemlos in der main.c benutzen kann. Das komische daran ist, funktioniert auch bei entfernten #include <> in der main. Ist hier an der Linker-Einstellung noch was zu ändern? Hatte jemand schon mal das gleiche Problem? Jens
:
Verschoben durch Moderator
Ich verstehe dein "Problem" nicht, zumal du "problemlos" geschrieben hast. Prototypen in der .h sind nicht zwingend. Der Compiler sollte halt eine Warning generieren. Problem: Es wird halt ein Funktionstypen Set angenommen vom Compiler, aufgrund des Aufruf der Funktion. Besser ist halt, wenn die Prototyp Declaration da ist in der include Datei, denn dann kann die Funktion nicht "falsch" benutzt werden.
Die Prototypen der Funktionen müssen dem Compiler zum Zeitpunkt des Aufrufs bekannt sein. Das sind sie natürlich auch, wenn in einer Datei zunächst die Implementierung der Funktion kommt und danach erst ihr Aufruf.
Thomas W. schrieb: > Es wird halt ein Funktionstypen Set angenommen vom Compiler, aufgrund > des Aufruf der Funktion. Nicht ganz. Es wird eine prototypenlose Funktionsdeklaration angenommen, “all the world is an int”. Eine solche Funktion entspricht dem, was in C vor der 1989er Standardisierung üblich war: die Funktion gibt einen "int" zurück (von dem üblicherweise angenommen wird, dass man ihn ggf. auch in einen gültigen Objektzeiger wandeln kann), und sie nimmt eine unbestimmte Anzahl von Argumenten. Das ist halt der kleinste gemeinsame Nenner, wie er bis vor 30 Jahren üblich war. Seither sollte man diesen vermeiden und stattdessen eine explizite Funktionsdeklaration parat haben. Der Linker wiederum interessiert sich nur dafür, ob er alle unreferenzierten Symbole irgendwie auffinden kann, entweder in bereits gelinkten Objektmodulen, oder aus einer Bibliothek. Da die gelinkten Objektmodule natürlich die Implementierung aller erforderlichen Funktionen enthalten, funktioniert es am Ende alles.
Jens G. schrieb: > Jedoch fällt mir gerade auf - dass ich neue Funktionen - die nur in der > *.c Datei definiert sind (und nicht in der*.h) problemlos in der main.c > benutzen kann. Das komische daran ist, funktioniert auch bei entfernten > #include <> in der main. Wenn du das angemeckert haben willst: compilieren mit -Werror=missing-prototypes -Werror=strict-prototypes bzw. nur als Warnung: -Wmissing-prototypes -Wstrict-prototypes Außerdem sollte es heißen #include "modul.h" statt #include <modul.h> denn es handelt sich dabei vermutlich nicht um einen System-Header wie etwa math.h oder stdlib.h.
Vielen dank erstmal für die schnelle Hilfe. Das sind gute Hinweise, doch trifft es die zusätzliche Compilereinstellung mit Warnings ganz gut. Sowas habe ich gesucht. @ Johann L. richtig, war ein Flüchtigkeitsfehler. Meine selbst geschriebenen Module sind mit #include "xyz.h" eingebunden.
Jens G. schrieb: > Das sind gute Hinweise, doch trifft es die zusätzliche > Compilereinstellung mit Warnings ganz gut. Sowas habe ich gesucht. Die müssten eigentlich in -Wall mit drin sein. Das sollte man dem GCC immer mitgeben.
Jim M. schrieb: > Die müssten eigentlich in -Wall mit drin sein. Das sollte man dem GCC > immer mitgeben. leider nicht - bei meinen avr-gcc Version 4.3.3 habe ich immer -Wall angegeben, er hat aber nie wg. Prototypen gemeckert - ich hatte z.B eine Funktion deklariert "uint8_t test()" (in der Definition stand dann natürlich "uint8_t test(void)" - da hat das -Wall nichts gebracht, aber mit der Johann L. schrieb: > -Werror=missing-prototypes -Werror=strict-prototypes > > bzw. nur als Warnung: > > -Wmissing-prototypes -Wstrict-prototypes hat der Compiler dieses fehlende "void" in der Deklaration gemeldet...
Egonwalter M. schrieb: > Jim M. schrieb: >> Die müssten eigentlich in -Wall mit drin sein. Das sollte man dem GCC >> immer mitgeben. > > leider nicht - bei meinen avr-gcc Version 4.3.3 habe ich immer -Wall > angegeben, er hat aber nie wg. Prototypen gemeckert Ist das auch abhängig vom gewählten Standard? Wenn ich das richtig verstehe, sind Funktionsprototypen ja noch nicht so alt wie C als Programmiersprache... MfG, Arno
Arno schrieb: > Wenn ich das richtig verstehe, sind Funktionsprototypen ja noch nicht so > alt wie C als Programmiersprache. Sie sind aber so alt, wie die Standardisierung von C überhaupt. :) Sie wurden mit ANSI C89 bzw. ISO C90 (was das gleiche ist) eingeführt. Die Option für Prä-C89-Code heiß/hieß "-traditional". Die benutzt wohl niemand mehr.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.