Präprozessor: String für #include zusammenbauen

#5326756
Lesenswert?

Hallo zusammen,

ich habe einen Haufen Header-Dateien, die Lookuptables enthalten, und 
deren Name identisch mit der darin definierten Variable ist. Ich will 
nur eine davon einbinden und auch einer Variablen zuweisen.

Sprich sie werden so genutzt:
1
//#include "abcdefg123.h"
2
//char *bitmap = &abcdefg123;
3
#include "abdefg123.h"
4
char *bitmap = &abdefg123;
5
//#include "abcdef123.h"
6
//char *bitmap = &abcdef123;
7
//#include "abcdefg124.h"
8
//char *bitmap = &abcdefg124;
9
   ...

Lieber wäre es, wenn ich mit Präprozessormagie nur eine Konstante 
anpassen müßte. Ungefähr so:
1
#define BITMAPFILE(NAME) "NAME ## .h"
2
#define BITMAP abdefg123
3

4
#include BITMAPFILE(BITMAP)
5
char *bitmap = &BITMAP;

Anscheinend scheint der Präprozessor das Include nur vor der 
Zeichenkettenoperation auszuführen.

Gibt es einen Trick, wie ich Variable + Header-Datei dennoch nur an 
einer Stelle einstellen kann?

Viele Grüße
W.T.
Moderator #5326771
Lesenswert?

Eine #include-Direktive mit variablem Argument ist m.W. nicht möglich.
Du kannst das Include-File aber statt mit #include mit der Compiler-
Option -include einbinden und im Makefile, der Shell oder von wo immer
der Compiler aufgerufen wird, den Dateinamen variabel machen.

Edit:

Doch, #include ist natürlich auch mit einem Macro als Argument möglich. 
Ich habe da etwas durcheinander geschmissen.
Gast #5326871
Lesenswert?

Walter T. schrieb:

> Naja, #ifdefs würden dazu führen, dass ich neue neue Header-Datei
> anstelle an zwei Stellen nur noch an drei Stellen einpflegen müsste...

Nicht, wenn Du eine zentrale variable Headerdatei machst, in der per 
ifdef die Einblendungen gemacht werden, und Du diese zentrale 
Headerdatei dann ansonsten ohne ifdef inkludierst.
Gast #5326930
Lesenswert?

Meiner Ansicht nach wäre es am saubersten diese Lookup Tabelle innerhalb 
deines Build Prozesses zu generieren. Sie kommt dann in das Verzeichnis 
wo auch die generierten obj Dateien landen. Und zwar nur genau die eine, 
die für dein aktuelles Build die richtige ist.
#5327527
Lesenswert?

Johann L. schrieb:
> Beispiel:

Danke! Das war genau das, was ich gesucht habe.

Wilhelm M. schrieb:
> Warum solche Klimmzüge: mit constexpr-Funktionen kannst Du doch die
> Lookup-Tabellen elegant im C++-Code selbst berechnen.

Momentan erzeuge ich die Bitmap-Tabellen immer extern in Matlab. Im 
Build-Prozeß wäre natürlich super - allerdings kann ich mir das gerade 
nicht vorstellen, ohne dass der Build-Prozess auf externe Werkzeuge wie 
z.B. ImageMagick zugreift. Kannst Du das mal als Beispiel zeigen? Ich 
habe mal ein Roh-Bitmap angehängt.
Angehängte Dateien:
#5327531
Lesenswert?

Walter T. schrieb:

> Wilhelm M. schrieb:
>> Warum solche Klimmzüge: mit constexpr-Funktionen kannst Du doch die
>> Lookup-Tabellen elegant im C++-Code selbst berechnen.
>
> Momentan erzeuge ich die Bitmap-Tabellen immer extern in Matlab. Im
> Build-Prozeß wäre natürlich super - allerdings kann ich mir das gerade
> nicht vorstellen, ohne dass der Build-Prozess auf externe Werkzeuge wie
> z.B. ImageMagick zugreift. Kannst Du das mal als Beispiel zeigen? Ich
> habe mal ein Roh-Bitmap angehängt.

Ich hatte oben nur etwas von Lookup-Tabelle gelesen und damit nicht das 
Zeichen von Bildern assoziiert.

Geht aber um das Umwandeln (nicht das Erzeugen) von BitMap-Daten, so 
kann man es schon so machen.

Bei den Bildern oder sagen wir besser Icons habe ich es so gelöst, dass 
ich die selbstverständlich mit einem Grafikprogramm erzeuge und dann als 
XBM (Header) speichere. Die XBM-Datei wird dann so inkludiert, wie sie 
ist. Das XBM-Format (es repräsentiert ja die Daten in einem 
char-C-Array) ist oft nicht das, was man als BitMap gebrauchen kann, und 
das kann man dann per constexpr-Funktion in das Zielformat umwandlen. 
Natürlich kann man Grafiken auch algorithmisch erzeugen, aber ich 
bezweifle, dass es irgendeine Grafik-Bibliothek gibt, die aus 
constexpr-Funktionen besteht bzw. dass es das ist, was Du machen 
möchtest.
#5328810
Lesenswert?

Walter T. schrieb:
> Johann L. schrieb:
>> Beispiel:
>
> Danke! Das war genau das, was ich gesucht habe.
>

Das ist zwar "bewundernswert smarte Präprozessor-Magie", aber doch ein 
Krampf, wenn man's pflegen und sich immer wieder neu eindenken muss.

Für die constexpr-Logik gilt nach meinem Geschmack Ähnliches.

M.E. gehört solcherlei Preprocessing ins Makefile und sonst nirgendwo 
hin. Dort würde zumindest ich danach suchen.
Gast #5328934
Lesenswert?

ich mache das mit texten so ...

in dem textfile ist dann nur formatiert der inhalt des arrays
1
{ 
2
   "text"
3
}


im code dann
1
const char *sprache[]={
2
#include "textfile.txt"
3
}

das klappt auch mit anderen sachen. nur muss die zu includierende datei 
entsprechend formatiert sein.


oder du machst ein binary draus und verknüpfst das über den linker

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