Forum: PC-Programmierung Problem mit __extension__ und __attribute__


von Harald (Gast)


Lesenswert?

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

von Harald (Gast)


Lesenswert?

Ah gerade gesehen das das Flag -nostdinc beim eigentlichen Aufruf nicht 
vorkommt damit er wieder die Standardheaders nimmt.

von Harald (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

kann du nicht einfach ein suche/ersetzen über die Ausgangsdatei machen?

von Rolf Magnus (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

Ok, da war ich wohl zu langsam...

von fresh (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von fresh (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von fresh (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Harald (Gast)


Lesenswert?

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__='

von Karl H. (kbuchegg)


Lesenswert?

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
von Harald (Gast)


Lesenswert?

Nein der Parser ist nicht selbst geschrieben und ist ein C Code Parser 
für Python. Der Name des Parsers ist Pycparser.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sowas?

-D__asm__(...)=(void)

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.