Präprozessor Makros auflösen

Gast #2642651
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
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
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
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
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 #2642708
Retep schrieb:
> Welchen Compiler setzt Du ein?

ähm im Moment keinen, hab die Files so bekommen. Aber letztendlich ist 
der Code für ne PowerPC Architektur gedacht.

Es müsste ja nicht komplett compilieren, nur die Ersetzungen sollten 
gemacht werden
Gast #2642734
..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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.