Forum: Mikrocontroller und Digitale Elektronik Atmel Studio - Fehler beim Compilieren bzw. Präprozessor


von Marius (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe da ein kleines Problem. In meiner main.c habe ich eine 
Headerdatei eingebunden, welche folgenden Abschnitt enthält:

>Abchnitt aus test.h
1
#ifdef F_CPU
2
#warning "F_CPU OK"
3
#endif
4
5
6
#ifndef F_CPU
7
#define F_CPU 16000000UL
8
#warning "F_CPU not defined!"
9
#endif

Allerdings werden beide #warning ausgegeben. Das kann doch eigentlich 
nicht sein. Oder doch?
Generell bekomme ich beim Compilieren auch immer die Warnung, dass F_CPU 
nicht definiert ist. Beim zweiten Compilieren ist der Fehler weg, also 
wenn test.h nicht geändert wurde.

Hier der relevante Teil meiner main.c:

>Abschnit aus main.c
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include "test.h"

Ich definiere doch F_CPU bevor alle anderen Dateien eingebunden werden. 
Warum kommt also immer die Meckermeldung, dass in test.h F_CPU noch 
nicht definiert ist?! delay.h wirft ja auch keine...

Ich bin echt ratlos. Was mache ich falsch?

Weihnachtliche Grüße
Marius

von Rolf M. (rmagnus)


Lesenswert?

Gibt es vielleicht noch eine zweite Datei, in der der Header eingebunden 
ist?

von Marius (Gast)


Lesenswert?

Ja, noch in der dazugehörigen test.c. Aber das ist ja ganz normal.

von Rolf M. (rmagnus)


Lesenswert?

Klar ist das normal. Aber es erklärt das von dir beobachtete Verhalten. 
Dann kommt nämlich die eine Meldung von der Übersetzung von main.c und 
die andere von der Übersetzung von test.c, wo F_CPU nicht bekannt ist.

von Marius (Gast)


Lesenswert?

Hmm. Das leuchtet mir ein.

Bisher war ich der Meinung, dass test.c erst nach main.c übersetzt wird 
(soweit stimmts ja) und daher F_CPU schon bekannt ist (das war mein 
Fehler). Aber klar, so macht es keinen Sinn. Es wird ja erst C-Datei für 
C-Datei übersetzt und dann zusammengeführt.

Sinnvoll wäre ein #warning also nur, wenn ich eine Headerdatei mit 
reinen #defines oder Makros (also ohne dazugehörige C-Datei) hätte, die 
F_CPU verwendet. Denn dann wird es auch nur ausgegeben, wenn man F_CPU 
in main.c wirklich vergisst.

Richtig?

von Marius (Gast)


Lesenswert?

Die if Abfrage bleibt natürlich, damit F_CPU während des compilierens 
von main.c nicht zweimal definiert wird.

von Rolf M. (rmagnus)


Lesenswert?

Marius schrieb:
> Hmm. Das leuchtet mir ein.
>
> Bisher war ich der Meinung, dass test.c erst nach main.c übersetzt wird
> (soweit stimmts ja) und daher F_CPU schon bekannt ist (das war mein
> Fehler). Aber klar, so macht es keinen Sinn. Es wird ja erst C-Datei für
> C-Datei übersetzt und dann zusammengeführt.

Richtig. Deshalb spielt die Reihenfolge, in der übersetzt wird, dafür 
keine Rolle.

> Sinnvoll wäre ein #warning also nur, wenn ich eine Headerdatei mit
> reinen #defines oder Makros (also ohne dazugehörige C-Datei) hätte, die
> F_CPU verwendet. Denn dann wird es auch nur ausgegeben, wenn man F_CPU
> in main.c wirklich vergisst.

Der gängige Weg wäre, F_CPU nicht in main.c, sondern über die 
Compiler-Kommandozeile zu setzen (-DF_CPU=16000000). Dann ist es 
automatisch überall bekannt.

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.