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
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).
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
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?
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
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.
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
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... :-(
..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.
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
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.