Forum: PC-Programmierung gcc #include mit Macro


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Taucher (Gast)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Das scheint ein Problem von C:B zu sein…

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.