Forum: PC-Programmierung gcc #include mit Macro


von Taucher (Gast)


Lesenswert?

Wenn ich den Dateinamen per per #define CONFIG_H definiere, funktioniert 
der folgende Code:
1
#ifdef CONFIG_H
2
    #include CONFIG_H
3
#endif // CONFIG_H

Wenn ich CONFIG_H per gcc-Kommandozeile mit der -D-Option definiere, 
funktionierts nicht.

Gibt es dafür einen irgendwo dokumentierten Grund?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Taucher schrieb:
> Gibt es dafür einen irgendwo dokumentierten Grund?

Es funktioniert doch:
1
$ echo hello, world! > foobar.h
2
$ cc -E -DFOO='"foobar.h"' -
3
#include FOO
4
# 1 "<stdin>"
5
# 1 "<built-in>" 1
6
# 1 "<built-in>" 3
7
# 338 "<built-in>" 3
8
# 1 "<command line>" 1
9
# 1 "<built-in>" 2
10
# 1 "<stdin>" 2
11
# 1 "./foobar.h" 1
12
hello, world!
13
# 2 "<stdin>" 2

von Taucher (Gast)


Lesenswert?

Ich habe folgende Varianten ausprobiert:
1
avr-gcc -Wall -mmcu=atmega328p -DF_CPU=16000000UL -g -DCONFIG_H='"config.h"' -I. -I/usr/lib/avr/include -c libraries/scheduler/scheduler.c -o obj/Debug/libraries/scheduler/scheduler.o
2
In file included from libraries/scheduler/scheduler.c:10:0:
3
libraries/scheduler/scheduler.h:6:14: error: #include expects "FILENAME" or <FILENAME>
4
     #include CONFIG_H
5
              ^
1
avr-gcc -Wall -mmcu=atmega328p -DF_CPU=16000000UL -g -DCONFIG_H="config.h" -I. -I/usr/lib/avr/include -c libraries/scheduler/scheduler.c -o obj/Debug/libraries/scheduler/scheduler.o
2
In file included from libraries/scheduler/scheduler.c:10:0:
3
libraries/scheduler/scheduler.h:6:14: error: #include expects "FILENAME" or <FILENAME>
4
     #include CONFIG_H
5
              ^
1
avr-gcc -Wall -mmcu=atmega328p -DF_CPU=16000000UL -g -DCONFIG_H=config.h -I. -I/usr/lib/avr/include -c libraries/scheduler/scheduler.c -o obj/Debug/libraries/scheduler/scheduler.o
2
In file included from libraries/scheduler/scheduler.c:10:0:
3
libraries/scheduler/scheduler.h:6:14: error: #include expects "FILENAME" or <FILENAME>
4
     #include CONFIG_H
5
              ^

Keine tut, was ich will. Der Aufruf erfolgt aus Code:Blocks 16.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Irgendein Quoting-Problem mit der IDE?
1
$ cat myconfig.h 
2
int foo = 42;
3
$ cat foo.c
4
#include CONFIG_H
5
$ avr-gcc -DCONFIG_H='"myconfig.h"' -c foo.c
6
$

Wichtig ist, dass die double quotes Bestandteil des Makros sind.

von Taucher (Gast)


Lesenswert?

Das scheint ein Problem von C:B zu sein…

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Vielleicht verschlucken sie die Quotes vor dem Aufruf, obwohl sie sie 
anzeigen?

Du kannst es natürlich auch mit <> probieren und dann bei -I das 
aktuelle Verzeichnis mit angeben.

von Taucher (Gast)


Lesenswert?

Jörg W. schrieb:
> Du kannst es natürlich auch mit <> probieren und dann bei -I das
> aktuelle Verzeichnis mit angeben.

So habe ich es auch hingebogen. Jetzt muss eben im Projektverzeichnis 
immer eine config.h liegen, egal, was drin steht.

von Mark B. (markbrandis)


Lesenswert?

Taucher schrieb:
> Wenn ich den Dateinamen per per #define CONFIG_H definiere, funktioniert
> der folgende Code:
>
1
> #ifdef CONFIG_H
2
>     #include CONFIG_H
3
> #endif // CONFIG_H
4
>

Was genau soll das eigentlich sein?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mark B. schrieb:
> Was genau soll das eigentlich sein?

Was ist daran unverständlich?

Wenn es einen Makro CONFIG_H gibt, dann soll die entsprechende Datei 
an der Stelle als include reingezogen werden. Vermutlich, weil sich 
darin irgendwelche konfigurierbaren Parameter befinden …

von Mark B. (markbrandis)


Lesenswert?

Jörg W. schrieb:
> Wenn es einen Makro CONFIG_H gibt, dann soll die entsprechende Datei
> an der Stelle als include reingezogen werden. Vermutlich, weil sich
> darin irgendwelche konfigurierbaren Parameter befinden …

Schon, nur wie passt das dazu:

> Jetzt muss eben im Projektverzeichnis
> immer eine config.h liegen, egal, was drin steht.

Bei einem nicht definierten Makro CONFIG_H sollte das ja nicht nötig 
sein? 🤔

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich denke, das bezog sich auf die Unzulänglichkeit der Build-Umgebung, 
den Makro passend weiterzureichen.

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.