dポイントプレゼントキャンペーン実施中!

プロセッサを調べるプログラムをコンパイルしたところ、
以下のような

static inline void cpuid (int op, int *eax, int *ebx, int *ecx, int *edx) {
asm("cpuid": "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx);
: "a" (op) : "cc");
}

ところで

error C2054: 'inline' の後にはカッコが必要です。
error C2085: 'cpuid' : 仮引数リスト内にありません。
error C2143: 構文エラー : ';' が '{' の前に必要です。

というエラーが出てきました。
何か間違っているところがあれば教えてください。
お願いします。

A 回答 (3件)

もし、おつかいのコンパイラがVCなら、inline、asm は、C言語では使えません。


代わりに、__inline、__asm を使います。
さらに、インラインアセンブラの構文が、VCのインラインアセンブラではありません。
質問にあるコードは、GCCのインラインアセンブラの構文です。

この回答への補足

回答ありがとうございます。
勉強になります。

それで実行した結果、質問のエラーは消えたのですが、構文エラーが出てきました。
VCのインラインアセンブラはどう書いたらいいのでしょうか?
わがまま言ってすいません。

補足日時:2006/03/01 20:23
    • good
    • 0

#1の方の指摘どおり、asmの行の最後、(*edx)の直後のセミコロンを取り除けば、i686ターゲットのGCCならコンパイルできました。



エラーメッセージを見る限り、Visual C++のようです。Visual C++はC99に対応していませんので、inlineは使えませんし、インラインアセンブラの書式も異なります(#2の方の指摘どおり)。

この回答への補足

回答ありがとうございます。
指摘の通りに直したところ関数の表示になりました。
それで以下

static __inline void cpuid (int op, int *eax, int *ebx, int *ecx, int *edx) {
__asm "cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op) : "cc" ;
}

で再度実行したところ

error C2400: 'オペコード' の 'bad token' はインライン アセンブラの構文エラーになります。

とやはりエラーがでました。
VCの場合のインライン アセンブラの構文とはどんなものなんでしょうか?もしよろしければ教えてください。

補足日時:2006/03/01 20:13
    • good
    • 0

コンパイラ何?


asmの行の最後のセミコロンが気になるけど大丈夫?
前の行とかにエラーないよね?
    • good
    • 0
この回答へのお礼

回答ありがとう。
コンパイラはVCで他にエラーはありません。

お礼日時:2006/03/01 19:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!