Atmel Studio - Fehler beim Compilieren bzw. Präprozessor

Gast #5255729
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
Angehängte Dateien:
Gast #5255839
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?
#5256367
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.

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