#define F_CPU

OP #2734389
Lesenswert?

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?
#2734397
Lesenswert?

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.
Gast #2734405
Lesenswert?

#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.
Gast #2734406
Lesenswert?

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.
#2734417
Lesenswert?

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.
Gast #2734425
Lesenswert?

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.
Gast #2734430
Lesenswert?

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.
#2734449
Lesenswert?

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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren