4

私は今、プロジェクトをコンパイルしようとし-std=c99ていますが、今のところ理解できないエラーに直面しています。この行:

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

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

これが何を意味するのかを理解するのに役立つ手がかりは大歓迎です。私はこの行を書いていません。また、その目的が何であるかを理解することもできません。

4

3 に答える 3

12

この線

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

レジスタ内の値を取得しeax、ポインタとして解釈してtd変数に入れる必要があります。ただし、多くのGNU拡張機能、特にステートメント式とこのasm(明示的なレジスタ割り当て)の使用を使用します。-std = gnu99(またはそれが呼ばれるもの)に切り替えることをお勧めします。それ以外の場合は、二重アンダースコア(例:asm-> __asm)または__extension__キーワードを使用することをお勧めしますが、c99モードで役立つかどうかはわかりません。

編集:私はそれを試してみて、単に作品に変更asmしました__asm

于 2009-04-16T10:32:30.100 に答える
3

asm()では動作しないようです-std=c99。私の意見では、これは悪い考えです。なぜなら、標準では実際にはコンパイラがasm()キーワードをサポートすることを示唆していますが、必須ではないからです。

代わりに使用することをお勧めします-pedantic

于 2009-04-16T10:25:17.077 に答える
-1

問題は asm ではなく、その arg0 のように見えます

于 2009-04-16T10:11:09.717 に答える