2009-04-16 51 views
4

私は現在-std=c99でプロジェクトをコンパイルしていますが、私は間違いを抱えています。このライン:C言語のASMは-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 

任意の手掛かりはこれが何を意味するのか理解する私を助けるために歓迎されています。私はこの行を書きませんでしたし、その目的が何であるかもわかりません。

+3

-std = gnu99を代わりに使用してください。 –

答えて

12

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

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

編集:私はそれを試しただけで、asm__asmに変更するだけです。

+0

ありがとう - 私はこの問題に直面しました。 C99が問題であることは明らかではありません! –

-1

ASMが存在しないという問題は、そのarg0のよう

+0

いいえ、問題はasmです。 arg0は、asmを含む宣言を持つ単なる変数なので、コンパイラは混乱します。 – jpalecek

2

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

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

+3

代わりに '-std = gnu99'を試してください。これは' asm() '関数のサポートを有効にします。 – gbmhunter

+1

@gbmhunter 11標準(つまり、 'gnu11'と' gnu ++ 11')と同じです。ヒントをありがとう! –

関連する問題