• ベストアンサー

inline

プロセッサを調べるプログラムをコンパイルしたところ、 以下のような 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: 構文エラー : ';' が '{' の前に必要です。 というエラーが出てきました。 何か間違っているところがあれば教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • colder
  • ベストアンサー率43% (30/69)
回答No.2

もし、おつかいのコンパイラがVCなら、inline、asm は、C言語では使えません。 代わりに、__inline、__asm を使います。 さらに、インラインアセンブラの構文が、VCのインラインアセンブラではありません。 質問にあるコードは、GCCのインラインアセンブラの構文です。

ion_2005
質問者

補足

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

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

#1の方の指摘どおり、asmの行の最後、(*edx)の直後のセミコロンを取り除けば、i686ターゲットのGCCならコンパイルできました。 エラーメッセージを見る限り、Visual C++のようです。Visual C++はC99に対応していませんので、inlineは使えませんし、インラインアセンブラの書式も異なります(#2の方の指摘どおり)。

ion_2005
質問者

補足

回答ありがとうございます。 指摘の通りに直したところ関数の表示になりました。 それで以下 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の場合のインライン アセンブラの構文とはどんなものなんでしょうか?もしよろしければ教えてください。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

コンパイラ何? asmの行の最後のセミコロンが気になるけど大丈夫? 前の行とかにエラーないよね?

ion_2005
質問者

お礼

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

関連するQ&A

専門家に質問してみよう