2009-04-16 7 views
4

Je suis maintenant prêt à compiler mon projet avec -std=c99 et je suis confronté à une erreur que je ne comprends pas pour le moment. Cette ligne:ASM in C donne une erreur avec -std = c99

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

me donne l'erreur suivante que dans 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 

Tous les indices sont les bienvenus pour me aider à comprendre ce que cela signifie. Je n'ai pas écrit cette ligne et je ne suis pas sûr de comprendre quel est son but.

+3

Essayez plutôt d'utiliser -std = gnu99. –

Répondre

12

La ligne

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

devrait obtenir une valeur dans le registre eax, interprété comme un pointeur, dans la variable td. Cependant, il utilise beaucoup d'extensions GNU, en particulier les expressions d'instruction et cette utilisation de asm (allocation de registre explicite). Je vous suggère de passer à -std = gnu99 (ou quel que soit son nom). Sinon, vous voudrez peut-être jouer avec des caractères de soulignement doubles (par exemple, asm ->__asm) ou le mot-clé __extension__, mais je ne sais pas si cela vous aidera en mode c99.

Editer: Je viens de l'essayer et de simplement changer asm à __asm fonctionne.

+0

Merci - J'ai juste rencontré ce problème aussi. Ce n'est pas évident que C99 est le problème! –

-1

Le problème il n'y a pas asm, ressemble à son arg0

+0

Non, le problème est asm; arg0 est juste une variable avec une déclaration contenant asm, donc le compilateur est confus à ce sujet. – jpalecek

2

asm() ne semble pas travailler avec -std=c99. C'est une mauvaise idée à mon avis, puisque la norme suggère que les compilateurs supportent un mot-clé asm(), mais ce n'est pas obligatoire.

Je suggère que vous utilisiez -pedantic à la place.

+3

Essayez '-std = gnu99' à la place, ceci active le support de la fonction' asm() '. – gbmhunter

+1

@gbmhunter Idem pour le standard 11 (c'est-à-dire 'gnu11' et' gnu ++ 11'). Merci pour le conseil! –

Questions connexes