2009-04-16 8 views
4

Ich bin jetzt bereit, mein Projekt mit -std=c99 zu kompilieren und ich bin mit einem Fehler konfrontiert, den ich im Moment nicht verstehe. Diese Zeile:ASM in C gibt einen Fehler mit -std = c99

my_type* td = ({ register kmy_type* arg0 asm("eax"); arg0; }); 

gibt mir die folgende Fehlermeldung nur in C99:

warning: ISO C forbids nested functions 
error: syntax error before ‘asm’ 
error: ‘arg0’ undeclared (first use in this function) 
error: (Each undeclared identifier is reported only once 
error: for each function it appears in.) 
warning: ISO C forbids braced-groups within expressions 

Irgendwelche Hinweise sind willkommen, mir helfen zu verstehen, was das bedeutet. Ich habe diese Zeile nicht geschrieben, und ich bin mir auch nicht sicher, was es bedeutet.

+3

Versuchen Sie stattdessen, -std = gnu99 zu verwenden. –

Antwort

12

Die Linie

my_type* td = ({ register my_type* arg0 asm("eax"); arg0; }); 

sollte als Zeiger, in td Variable einen Wert im eax Register, interpretiert bekommen. Es verwendet jedoch viele GNU-Erweiterungen, insbesondere Anweisungsausdrücke und diese Verwendung von asm (explizite Registerzuordnung). Ich würde vorschlagen, dass Sie zu -std = gnu99 wechseln (oder wie auch immer es heißt). Andernfalls möchten Sie vielleicht mit doppelten Unterstrichen (zB asm ->__asm) oder dem Schlüssel __extension__ spielen, aber ich weiß nicht, ob es im c99-Modus helfen wird.

Edit: Ich habe es gerade versucht und einfach asm zu __asm ändern funktioniert.

+0

Danke - Ich bin gerade auf dieses Problem gestoßen. Es ist nicht offensichtlich, dass C99 das Problem ist! –

-1

Das Problem gibt es nicht asm ist, sieht aus wie seine arg0

+0

Nein, das Problem ist asm; arg0 ist nur eine Variable mit einer Deklaration, die asm enthält, daher ist der Compiler darüber verwirrt. – jpalecek

2

asm() nicht mit -std=c99 zu funktionieren scheint. Es ist meiner Meinung nach eine schlechte Idee, da der Standard tatsächlich vorschlägt, dass Compiler ein Schlüsselwort unterstützen, aber das ist nicht zwingend erforderlich.

Ich schlage vor, dass Sie stattdessen -pedantic verwenden.

+3

Probieren Sie stattdessen '-std = gnu99' aus, dies ermöglicht die Unterstützung der 'asm()' Funktion. – gbmhunter

+1

@gbmhunter Das gleiche gilt für den 11 Standard (d. H. 'Gnu11' und' gnu ++ 11'). Danke für den Tipp! –