Forum: Mikrocontroller und Digitale Elektronik AVR Warnmeldung trotz #ifndef _UART_H?


von Anton G. (antong)


Lesenswert?

Hallo,
mich verwirrt ein wenig die Warnmeldung #warning "F_CPU war nicht 
definiert." wenn ich mein Projekt compile. Ich verstehe eigentlich 
nicht, warum diese "3" mal erscheint. Ich habe meine uart.h zwar 
mehrmals eingebunden, aber ich dachte immer, dass man durch
#ifndef _UART_H
#define _UART_H
...
#endif
das mehrfache einbinden verhindert. Liest der Compiler das trotzdem?


Hier der Ausschnitt aus meiner uart.h
1
#ifndef _UART_H
2
#define _UART_H  
3
4
  #ifndef F_CPU    
5
    #define F_CPU 16000000
6
    #warning "F_CPU war nicht definiert."
7
  #endif
8
//...
9
#endif
Die Meldung dürfte doch nicht kommen. Ich habe Sie doch auch noch mal 
durch #ifndef F_CPU abgesichert.
Funktionieren tut allerdings alles. Aber wissen möchte ich das trotzdem 
wohl.Wie muß ich das verstehen?
Gruß Antong

von Klaus W. (mfgkw)


Lesenswert?

Kompilierst du evtl. 3 Quelltexte?
Der include guard verhindert nur das mehrfache Einlesen in einer 
"compilation unit", also in einer kompilierten C-Datei.
Bei der 2. und 3. kompilierten Datei wird natürlich trotzdem jeweils 
einmal wieder gelesen.

von Anton G. (antong)


Lesenswert?

Danke Klaus Wachtler für die schnelle Antort.

Jetzt muß ich aber noch mal ganz blöd nachfragen.
Ich habe mehrere ".c" Dateien und mehrere ".h" Dateien. In den drei ".c" 
Dateien binde ich 3mal die "uart.h" ein.
Es wird natürlich nur eine ".hex" Datei erstellt.
Ich dachte immer, genau dieses verhindert der #ifndef.
Das ist ja Käse. Wie kann ich das denn dann verhindern?
Gruß Antong

von Karl H. (kbuchegg)


Lesenswert?

Anton G. schrieb:
> Danke Klaus Wachtler für die schnelle Antort.
>
> Jetzt muß ich aber noch mal ganz blöd nachfragen.
> Ich habe mehrere ".c" Dateien und mehrere ".h" Dateien. In den drei ".c"
> Dateien binde ich 3mal die "uart.h" ein.
> Es wird natürlich nur eine ".hex" Datei erstellt.

Aber jede der 3 C-Dateien wird einzeln für sich alleine compiliert. und 
erst die Ergebnisse der 3 Compiliervorgänge wird dann zum ELF File 
zusammengelinkt.

> Ich dachte immer, genau dieses verhindert der #ifndef.
> Das ist ja Käse. Wie kann ich das denn dann verhindern?

Gar nicht.
Leb damit oder sorg dafür, dass in den Projekteinstellung eine gültige 
Definition für F_CPU vorhanden ist. IMHO ist dieses "war nicht 
definiert, wird jetzt automatisch definiert" sowieso Käse und sorgt für 
Fehler. Dieser scheinbare 'Komfort' wird ganz schnell zum Boomerang, 
wenn in diversen Files unterschiedliche Defaults sind, die dann auch 
nicht mit der tatsächlichen Taktrate übereinstimmen.
Ich hab schon lange umgestellt: Ist F_CPU nicht definiert, dann ist das 
ein Fehler. F_CPU in den Project Options einstellen und gut ists.

von Anton G. (antong)


Lesenswert?

Na gut kann ich mit leben.
Jetzt aber bitte nicht lachen.
Das bedeutet aber doch nicht, dass meine .hex Datei nachher drei mal die 
uart.h enthält oder?
Gruß und Danke Antong

von Karl H. (kbuchegg)


Lesenswert?

Anton G. schrieb:
> Na gut kann ich mit leben.
> Jetzt aber bitte nicht lachen.
> Das bedeutet aber doch nicht, dass meine .hex Datei nachher drei mal die
> uart.h enthält oder?

die h-Files tauchen im ELF sowieso nicht auf. Genausowenig wie die 
C-Files.

Diese Files werden compiliert! Also aus dem C-Code ein Maschinensprache 
Programm erzeugt, welches dem C-Programm entspricht. Dein µC spricht ja 
kein C.

Und im Header File hast du ja sowieso keine Definitionen (ausser 
Inline-Funktionen und mit denen weiß der Compiler schon, wie man damit 
umgeht)

von Anton G. (antong)


Lesenswert?

Na dann bin ich ja beruhigt.
Danke, dass ihr auch auf so dusselige Fragen vernünftig antwortet.

Schönen Gruß Anton

von Klaus W. (mfgkw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Leb damit oder sorg dafür, dass in den Projekteinstellung eine gültige
> Definition für F_CPU vorhanden ist. IMHO ist dieses "war nicht
> definiert, wird jetzt automatisch definiert" sowieso Käse und sorgt für
> Fehler. Dieser scheinbare 'Komfort' wird ganz schnell zum Boomerang,
> wenn in diversen Files unterschiedliche Defaults sind, die dann auch
> nicht mit der tatsächlichen Taktrate übereinstimmen.
> Ich hab schon lange umgestellt: Ist F_CPU nicht definiert, dann ist das
> ein Fehler. F_CPU in den Project Options einstellen und gut ists.

Mein Reden seit '45!

Aber es scheint beliebt zu sein, dieselben Fehler jahrzehntelang weiter 
zu genießen.

von Klaus W. (mfgkw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und im Header File hast du ja sowieso keine Definitionen (ausser
> Inline-Funktionen und mit denen weiß der Compiler schon, wie man damit
> umgeht)

Zumindest sollte es so sein.

Anton G. schrieb:
> Na dann bin ich ja beruhigt.

Aber es sollte gleich als Warnung hängen bleiben, daß es schief geht, in 
einer .h globale Variablen oder Funktionen zu DEFINIEREN statt nur zu 
deklarieren.

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
Noch kein Account? Hier anmelden.