web-dev-qa-db-ja.com

C / C ++の#defineマクロをテストするユーティリティはありますか?

#defineマクロを使って自分のやりたいことを正確に実行しようとすると、時間をかけすぎてしまうことがよくあります。以下に私の現在のジレンマを投稿します。どんな助けにも感謝します。しかし、本当にもっと大きな問題は、マクロが実際に行っていることをすばやく表示するために、誰かが推奨できるユーティリティがあるかどうかです。何が悪いのかを見ることができれば、遅い試行錯誤のプロセスでさえはるかに速く進むようです。

現在、私はDLLから作成した関数の長いリストを動的にロードしています。設定方法、関数ポインタはエクスポートされた関数と同じ名前を持ち、プロトタイプを作成するために使用されるtypedefは同じ名前ですが、先頭に下線が付いているため、関数ポインターの長い長いリストの割り当てを簡略化するために定義を使用したいと思います。

たとえば、以下のコードステートメントでは、 'hexdump'はtypedefされた関数ポイントの名前であり、関数の名前でもありますが、_hexdumpはtypedefの名前です。 GetProcAddress()が失敗した場合、失敗カウンターが増加します。

if (!(hexdump = (_hexdump)GetProcAddress(h, "hexdump"))) --iFail;

したがって、上記のような各行を次のようなマクロに置き換えたいとしましょう...

GETADDR_FOR(hexdump )

まあこれは私がこれまでに思いついた中で最高です。動作しません(私の//コメントはメッセージ内のテキストのフォーマットを防ぐためだけです)...

// #define GETADDR_FOR(a) if (!(a = (#_#a)GetProcAddress(h, "/""#a"/""))) --iFail; 

繰り返しますが、私が行った愚かな間違いについての洞察を認める一方で、マクロを接続するだけで、自分の方法のエラーを表示するユーティリティを手に入れることができます。

40
Randy

enter image description herehttps://godbolt.org/ に移動します。左ペインにコードを入力し、コンパイラを選択します。gccは、右ペインに引数を-Eとして入力します。前処理されたコードが右側に表示されます。

47
Mohit

プリプロセッサを介してコードを実行するだけで、コードが展開される内容が表示されます(または必要に応じてエラーが吐き出されます)。

 $ cat ac 
#define GETADDR_FOR(a)if(!(a =(#_#a)GetProcAddress(h、 "/" "#a"/"")))
 GETADDR_FOR(hexdump)
 
 $ gcc -E ac 
#1 "ac" 
#1 "<built-in>" 
#1 "<command-line>" 
#1 "ac" 
 ac:1:36:エラー: '#'の後にマクロパラメータがありません
 
 GETADDR_FOR(hexdump)

GCCではgcc -E foo.cはファイルを前処理するだけです。

Visual Studioが使用 the /P引数。

24
Mark Rushakoff

http://visualstudiogallery.msdn.Microsoft.com/59a2438f-ba4a-4945-a407-a1a295598088 -マクロを拡張するビジュアルスタジオプラグイン

6
Kester

Cプリプロセッサマクロでの文字列化またはトークン貼り付けの正確な構文について混乱しているようです。

Cプリプロセッサマクロ全般 についてのこのページが役立つかもしれません。

特に、このマクロは次のように読めるはずです。

_#define GETADDR_FOR(a) if (!(a = (_##a)GetProcAddress(h, #a))) --iFail
_

末尾の_;_は、これをGETADDR_FOR(hexdump);として入力する可能性が高いため、スキップする必要があります。そうしないと、Cコードで非常に奇妙に見え、多くの構文ハイライトを混乱させます。

そして、他の誰かが言及したように、_gcc -E_はプリプロセッサを実行し、他のコンパイル手順をスキップします。これは、プリプロセッサの問題をデバッグするのに役立ちます。

2
Omnifarious

Boost Wave をご覧ください。ほとんどのBoostと同様に、実際にはユーティリティというよりはライブラリですが、完全なプリプロセッサとして機能するドライバがあります。

1
Jerry Coffin