Präprozessor Makros auflösen

Gast #2642651
Lesenswert?

Hallo Leute,

ich weis nicht wie ich das machen soll:
Ich hab drei Dateien, x.h x.c und cfg.h

in der cfg.h kann man mit #define ... die x.h und x.c konfigurieren

soweit nix besonderes, aber die x.h und x.c bestehen quasi nur aus 
unglaublich großen Makros die ich so einfach nicht durchschau.

Jetzt würde ich gerne haben, dass die Makros korrekt aufgelöst werden, 
vielleicht kann ich sie dann besser nachvollziehen, aber wie stelle ich 
das an?

Gruß Peter
#2642661
Lesenswert?

Peter schrieb:

> Jetzt würde ich gerne haben, dass die Makros korrekt aufgelöst werden,
> vielleicht kann ich sie dann besser nachvollziehen, aber wie stelle ich
> das an?

Mit viel Geduld und Spucke.

(Du kannst auch vom Präprozessor das Endergebnis mit einem Commandline 
Switch bekommen. Das ist sinnvoll, wenn man nachsehen will, ob und wie 
alle Details aufgedröselt wurden. Aber zum Verstehen was das Makro auf 
algorithmischer Ebene macht, ist das meist nicht sehr hilfreich).
Gast #2642684
Lesenswert?

der Präprozessor macht doch erst "Textersetzung" bei
1
#define ...
1
#ifdef ...

und das sind extrem große Konstrukte zB:

1
#define INIT { \
2
    unsigned int i; \
3
    struktur.Version = 0; \
4
    struktur.EvtNumber = COUNT; \ //COUNT ist wieder ein #define
5
    struktur.Control = 0; \
6
    for (i=0;i<COUNT;i++) { \
7
      struktur.Event[i].Ctr = 0; \
8
    } \
9
  }

ich hätte jetzt quasi gerne den Code, wo diese Ersetzung schon komplett 
durchgefüht wurden, ich hoffe nun verstehts jeder :-)
(oder hab ich die falschen begriffe verwendet?)

Gruß Peter
Gast #2642700
Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber zum Verstehen was das Makro auf
> algorithmischer Ebene macht, ist das meist nicht sehr hilfreich).

stimmt, aber dann ist zumindest das ganze andere Zeug weg und alles was 
"zusammengehört" ist dann auch fertig ineinander eingesetzt ohne viel 
suchen zu müssen...

so stell ich mir das zumindest vor :-)

Wie könnte ich das konkret anstellen?
ich hab nur diese drei Dateien

Gruß Peter
#2642705
Lesenswert?

Peter schrieb:
> der Präprozessor macht doch erst "Textersetzung" bei
>
1
#define ...
>
1
#ifdef ...

Das #ifdef ist uninteressant, wenn es um Textersetzungen geht. Schon 
alleine das #define sorgt für eine Textersetzung.

Das #ifdef kann jetzt höchstens dafür sorgen, dass bestimmter Code 
überhaupt wegfällt, bzw. Makros auf eine von mehreren Alternativen 
festgelegt werden.

> und das sind extrem große Konstrukte zB:

Was ist da bitte 'extrem gross' daran.


Nimm deinen verwendenden Code. Der sieht vielleicht so aus

int main()
{
  int j;

  INIT;
}

und jetzt ersetzt du eben INIT durch den Makroinhalt

int main()
{
  int j;

  {
    unsigned int i;
    struktur.Version = 0;
    struktur.EvtNumber = COUNT; \ //COUNT ist wieder ein #define
    struktur.Control = 0;
    for (i=0;i<COUNT;i++) {
      struktur.Event[i].Ctr = 0;
    }
  }
}


COUNT ist seinerseits wieder ein Makro. Vielleicht
#define COUNT 15

also machst du den nächsten Durchgang und ersetzt COUNT durch 15


int main()
{
  int j;

  {
    unsigned int i;
    struktur.Version = 0;
    struktur.EvtNumber = 15;
    struktur.Control = 0;
    for (i=0;i<15;i++) {
      struktur.Event[i].Ctr = 0;
    }
  }
}


und so gehts weiter und weiter, indem du eine Makro-Ebene nach der 
anderen durch den Text ersetzt, für den das Makro steht. Solange, bis du 
das Gefühl hast, jetzt ist es besser aufzuhören, wie zb bei dem 
angenommenen COUNT Makro. Das in diesem Beispiel zu ersetzen ist 
meistens nicht mehr sinnvoll. Denn 15 'erzählt' dir beim Lesen weniger 
als COUNT.


Ich sagte doch: mit viel Geduld und Spucke. Und so hab ich das auch 
gemeint.
Gast #2642734
Lesenswert?

..wie der kollege schon erwähnte, den präprozessor-output per cmd-line 
switch anzeigen/ausgeben lassen, ggf. in eine datei umleiten, wie khb es 
schon vorgeschlagen hat.

dann siehst du, wie was entsprechend deiner in cfg.h gemachten 
einstellungen ersetzt wird.

mehr kann dir da nicht geholfen werden.

gn, tom.
Gast #2642770
Lesenswert?

Ich bins nochmal - yeah es hat mehr oder weniger geklappt (?!?!)

hab Visual C++ express verwendet und nach so einer Compileroption 
gesucht und auch gefunden (was mich schon überrascht hat)

Der Build-Prozess endet zwar in einer Fehlermeldung, dass der Linker nix 
zum linken bekommt (was auch logisch ist, da nachm Präprozessor 
abgebrochen wird) aber da sind tatsächlich *.i Dateien im 
Projektverzeichnis entstanden. Da sind zwar verdammt viele Leerzeilen 
drin aber die Makros hat er eingesetzt yuhu :-)

Also Danke für den Tip

Gut Nacht

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