#define F_CPU

#2734339
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)
OP #2734389
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
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
#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
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
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
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
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
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 ;-)
Gast #2734454
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.