In main.c: #define F_CPU 20000000UL #include <util/delay.h> In resolver.c: #define extern F_CPU 20000000UL Führt zu: Error 1 'F_CPU' undeclared (first use in this function) Wie erklär ich's meinem Compiler?
Joachim ... schrieb: > In main.c: > #define F_CPU 20000000UL > #include <util/delay.h> > > In resolver.c: > #define extern F_CPU 20000000UL > > Führt zu: > Error 1 'F_CPU' undeclared (first use in this function) > > Wie erklär ich's meinem Compiler? Falsche Frage. Richtige Frage: was macht eigentlich #define? (Nimm das extern raus und kauf dir ein C-Buch)
Joachim ... schrieb: > In main.c: > #define F_CPU 20000000UL > #include <util/delay.h> > > In resolver.c: > #define extern F_CPU 20000000UL > > Führt zu: > Error 1 'F_CPU' undeclared (first use in this function) > > Wie erklär ich's meinem Compiler? Noch bessere Frage: Woher bekomme ich ein C Buch?
Im Ritchie-Buch hab ich genau zu dem Fall nix gefunden. Der Fall "extern int" wird behandelt, "#define extern" nicht...
Kostenloses C-Buch zum Onlinelesen, soviel und sooft du willst: ( war auch meine C-Hilfe ;) ) http://openbook.galileocomputing.de/c_von_a_bis_z/ Gruß, Jakov
Hm... das online-Buch sagt: Befindet sich die Variable in einer anderen Datei, wird das Schlüsselwort extern davor gesetzt. Diese Speicherklasse wird für Variablen verwendet, die im gesamten Programm verwendet werden können. Das heißt, das #define damit nicht abgedeckt wird weil es keine Variable ist. Aber wie umgeh ich das dann?
Joachim ... schrieb: > Das heißt, das #define damit nicht abgedeckt wird weil es keine Variable > ist. > Aber wie umgeh ich das dann? Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest. Dann heißt es aber nur
1 | #define F_CPU 20000000UL |
Das Schlüsselwort extern gilt nur für Variablen. Über #define erzeugst du nur ein Zeichenalias, d. h. an der Stelle, wo du in deinem Code F_CPU stehen hast, wird der Compiler später 20000000UL einsetzen. Dahinter verbirgt sich also auch keine Speicheradresse, wie bei einer Variable.
#define ist aber keine Variablendefinition, sondern nur eine Textersetzung. Diese führt der C-Präprozessor vor dem Compilerlauf durch. Dabei wird u.A. der Inhalt der Include-Dateien vor dem Programmtext in der .c-Datei reinkopiert. Bei {#define Schlüsselwort Ersetzung} wird das "Schlüsselwort" überall, wo das auftaucht durch "Ersetzung" ersetzt. Das wird gerne genommen, um Konstanten numerisch nur einmal festzulegen und dann immer den selben Wert im Quellcode zu haben. In deinem Fall wird immer das extern mit in den Quelltext reinkopiert und erzeugt die syntaktischen Fehler an Stellen, wo F_CPU verwendet werden. Gruß, Adib.
André M. schrieb: > Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest. > Dann heißt es aber nur das ist doch alles unsinn - diesen define sollte einmal ein der entwicklungsumgebung oder im makefile angegeben werden. Es sollte überhaupt nicht in irgendwelchen *.h oder *.cpp dateien stehen.
Peter II schrieb: > André M. schrieb: >> Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest. >> Dann heißt es aber nur > > das ist doch alles unsinn - diesen define sollte einmal ein der > entwicklungsumgebung oder im makefile angegeben werden. Es sollte > überhaupt nicht in irgendwelchen *.h oder *.cpp dateien stehen. Header sind dafür da, um Programmelemente bereitzustellen, die mehrere Programmteile benötigen. Er könnte ja auch eine Variable nehmen, die den selben Zweck erfüllt und diese würde er auch in einen Header packen und per extern im jeweiligen Programmteil darauf zugreifen. Daher sehe ich nicht, waum das unsinn sein soll.
Peter II schrieb: > André M. schrieb: >> Erstelle dir eine Header Datei, die du in beiden *.c Dateien einbindest. >> Dann heißt es aber nur > > das ist doch alles unsinn - diesen define sollte einmal ein der > entwicklungsumgebung oder im makefile angegeben werden. Es sollte > überhaupt nicht in irgendwelchen *.h oder *.cpp dateien stehen. Genau so sieht's aus. F_CPU gibt man in einer gescheiten IDE irgenwo in den Projekteigenschaften an, das passende #define generiert die IDE dann zur Compilezeit und sorgt dafür, dass der Compiler es auch erhält.
André M. schrieb: > Daher sehe ich > nicht, waum das unsinn sein soll. weil es sich hierbei um eine anpassung an die Hardware handelt. Wenn ich einen andere Quarz verwenden will, dann muss ich nicht vorhanden Dateien bearbeiten sondern kann einfach meine Projekteinstellungen anpassen. Damit bleibt der Quellcode austauschbar.
Peter II schrieb: > André M. schrieb: >> Daher sehe ich >> nicht, waum das unsinn sein soll. > > weil es sich hierbei um eine anpassung an die Hardware handelt. Wenn ich > einen andere Quarz verwenden will, dann muss ich nicht vorhanden Dateien > bearbeiten sondern kann einfach meine Projekteinstellungen anpassen. > Damit bleibt der Quellcode austauschbar. Das ist doch mal ein Argument. So kann ich das voll und ganz nachvollziehen ;-)
Und wo stellt man das im Atmel Studio 6 ein? Habe es noch nicht gefunden. Im Studio 4.19 wusste ich es. Gruß aus Heidelberg P.S. Es regnet bei 30°C
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.