Hi Ich brauche von meinen Code den Output des Preprocessors. Dafür verwende ich das Flag -E beim gcc und leite den Output in eine Datei um. Das Funktioniert auch sehr gut. Diesen Ouptu übergebe ich anschliesend einen Parser und dieser hat Probleme mit den Erweiterungen _extension_ und _attribute_. Meine Frage ist es daher ob ich diese Erweiterungen irgendiwe ausblenden kann?! Folgende Parameter werden den gcc übergeben: -E -nostdinc -Wall -std=gnu99 -pedantic Danke im Vorhinein für alle Antworten. mfg Harald
Ah gerade gesehen das das Flag -nostdinc beim eigentlichen Aufruf nicht vorkommt damit er wieder die Standardheaders nimmt.
Ok wenn ich die beiden folgenden Flags dazugebe geht es. -D "__extension__=" -D"__attribute__(args)=" Allerdings sagt er dann das __gnuc_va_list Probleme macht. Der Code ist ein normaler C code und der Parser ist pycParser in Python. mfg Harald
kann du nicht einfach ein suche/ersetzen über die Ausgangsdatei machen?
Zur Not noch beim Präprozessor-Aufruf ein '-D__attribute__(x)=' dazu hängen. Du mußt nur schauen, daß deine Shell die Klammern nicht selbst auswertet.
Ich weiß das Thema ist zwar schon älter aber ich würde mich interessieren ob man diese ganzen gcc spezifischen Ausdrücke wie _extension_, _attribute_, und so weiter irgendwie automatisch deaktivieren kann. Sprich das man einen Code nach den Preprozessor erhät der keine dieser Ausdrücke beinhaltet. Das mit -D geht zwar aber es gibt ja doch recht viele solcher Ausdrücke. Habe leider bisher nichts gefunden daher meine Frage? mfg Harald
1 | #if defined(__GNUC__)
|
2 | # define EXTENSION __extension__
|
3 | # define ATTRIBUTE(x) __attribute__((x))
|
4 | #else /* !GCC */ |
5 | # define EXTENSION
|
6 | # define ATTRIBUTE(x)
|
7 | #endif
|
fresh schrieb: > Ich weiß das Thema ist zwar schon älter aber ich würde mich > interessieren ob man diese ganzen gcc spezifischen Ausdrücke wie > extension, attribute, und so weiter irgendwie automatisch > deaktivieren kann. Was meist du mit "deaktivieren"? Wenn diese in deinem Code drin stehen, stehen sie eben drin. "Deaktivieren" kannst du sie, indem du sie nicht reinschreibst. > Sprich das man einen Code nach den Preprozessor erhät > der keine dieser Ausdrücke beinhaltet. Der Preprozessor beachtet die gar nicht, denn mit denen hat er absolut nichts am Hut. Das ist für ihn Code, den er einfach durchreicht.
Hi Hätte gehoft das man beim Preprozessor mit einen Flag deaktivieren kann. Ich habe es in meinen Code eh nicht drinnen aber die ganzen Standard Headers haben es drinnen. Die Idee mit den defines ist sicher gut aber kann ich das so einfach für die Standard Headerdateien wie stdio.h oder ähnliches auch anwenden?! mfg fresh
fresh schrieb: > aber die ganzen Standard Headers haben es drinnen. Wofür stört das denn dort? Die müssen doch nicht portabel sein, die sind für genau einen Compiler gedacht und aufgebaut, und der versteht das.
Naja ich brauch den Output vom Preprozessor als Input für einen Parser und der hat Probleme mit diesen Erweiterungen. Aber was ich jetzt so gesehen habe ist das Format der Erweiterungen immer _ERWEITERUNG_ (optinal()) also versuche ich gerade diese einfach mittels eines eigenen Tools herauszulöschen und vielleicht gehts dann. mfg Fresh
fresh schrieb: > als Input für einen Parser Dann versuch doch, dem Parser das beizubringen. Ansonsten kannst du immer noch versuchen, dem Präprozessor ein
1 | -D__attribute__(x)="" -D__extension__="" |
mit auf die Reise zu geben.
Hi Wenn ich -D'__asm__(args)=' mit übergebe werden alle __asm__(xxx) gelöscht nun gibt es aber noch _asm_ ohne argumente welche er im Code drinnen läst. Dachte ich schreibe einfach noch -D'__asm__=' dazu und es geht aber das sieht er dann als redifinition. Gibt es da irgendwie eine andere Möglichkeit?!
1 | Wall -std=gnu99 -pedantic -E -D'__extension__=' -D'__attribute__(args)=' -D'__asm__=' -D'__asm__(args)=' -D'__builtin_va_list=int' -D'__restrict=' -D'__const=' -D'__inline=' -D'__volatile__=' |
Harald schrieb: > Hi > Wenn ich -D'__asm__(args)=' mit übergebe werden alle __asm__(xxx) > gelöscht nun gibt es aber noch _asm_ ohne argumente welche er im Code > drinnen läst. Dachte ich schreibe einfach noch -D'__asm__=' dazu und es > geht aber das sieht er dann als redifinition. Gibt es da irgendwie eine > andere Möglichkeit?! Schön langsam frag ich mich schon, ob es nicht einfach wäre, den Parser zu pimpen. Denn dadurch, das du zb. den __asm__(xxx) Teil aus dem Code löscht, wird ja nicht automatisch der ganze weitere Rest der Assembleranweisungen, die sich über die nächsten 20 Zeilen hinziehen, entfernt. Wohingegen es bei einem halbwegs vernünftigen Parser normalerweise keine Schwierigkeiten machen sollte, alles nach einem _asm_ (mit einer eventuellen Argumentliste) von der ersten öffnenden { bis zur letzten schliessenden } zu ignorieren. Was ist denn das für ein Parser? Selbst geschrieben?
:
Bearbeitet durch User
Nein der Parser ist nicht selbst geschrieben und ist ein C Code Parser für Python. Der Name des Parsers ist Pycparser.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.