Forum: Mikrocontroller und Digitale Elektronik Präprozessor Makros auflösen


von Peter (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Es würde helfen, die Frage etwas verständlicher zu formulieren. Und 
insbesondere so, dass sie für Andere nachvollziehbar ist.

von Karl H. (kbuchegg)


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).

von Peter (Gast)


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

von Peter (Gast)


Lesenswert?

Das Beispiel hab ich nur schnell zusammengebastelt

von Retep (Gast)


Lesenswert?

Peter schrieb:
> ich hätte jetzt quasi gerne den Code, wo diese Ersetzung schon komplett
> durchgefüht wurden

Du möchtest die Ausgabe des Präprzessors vor dem Compiler-Lauf.

Welchen Compiler setzt Du ein?

von Peter (Gast)


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

von Konrad S. (maybee)


Lesenswert?

Falls du mit gcc arbeitest:
 "If you use the `-E' option, nothing is done except preprocessing."

von Karl H. (kbuchegg)


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.

von Peter (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was ist da bitte 'extrem gross' daran.

Das war auch nur das Mini-Beispiel, weil der Kollege A. K. am Anfang 
nicht wusste was ich meine.

die Drei Dateien haben zusammen etwas 1500 Zeilen, nur große und kleine 
Makros die ineinander eingesetzt werden... :-(

von tom (Gast)


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.

von Peter (Gast)


Lesenswert?

Danke, werd ich mal versuchen, ich hoffe ich bekomm das hin

Gut Nacht für heut
Peter

von Peter (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

In Eclipse gibt es zudem die Option "Show Makro Expansion" wo man sogar 
angeben kann in welcher Tiefe er das auflösen soll.

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.