C++ マクロをデバッグするための適切な一般的な方法はありますか?
質問
一般に、定義内にいくつかのプリプロセッサ条件要素を含むネストされたマクロのチェーンが存在することがあります。実行されている実際のコードを直接確認するのは難しいため、これらをデバッグするのは困難な場合があります。
少し前に、それらを拡張するためのコンパイラ (gcc) フラグを見つけたことを漠然と覚えていますが、これを実際に機能させるのに苦労しました。
解決
gcc -E は、前処理されたソースを標準出力に出力します。
他のヒント
MSVC ユーザーの場合は、ファイル/プロジェクトを右クリックして設定を表示し、前処理されたソース (通常は obj ディレクトリにある) を出力するようにファイルのプロパティを変更できます。
これはあなたの状況には当てはまらないかもしれませんが、マクロはデバッグを実際に妨げるものであり、多くの場合、過剰に使用され、回避可能なものになります。
それらをインライン関数に置き換えたり、すべてまとめて削除したりすることはできますか?
おそらくマクロから離れて、インラインとテンプレートの使用を開始する必要があります。
マクロは古いツールですが、時には適切なツールでもあります。最後の手段として、printf はあなたの友人であることを覚えておいてください (実際、マルチスレッドの処理を行う場合、printf はそれほど悪い友人ではありません)。
ロードされたシンボルを使用して逆アセンブリをデバッグします。
GCC -Save -TEMPSは、コンパイラに渡される前に、Cプリプロセッサの出力である.i(またはC ++の.IIファイル)を書きます。これは多くの場合、啓発的なものとなる場合があります。
GCC および互換コンパイラは、-E オプションを使用して、前処理されたソースを標準出力に出力します。
gcc -E foo.cpp
Sun Studio は次のフラグもサポートしています。
CC -E foo.cpp
しかし、さらに優れているのは -xdumpmacros です。さらに詳しい情報を見つけることができます サンズのドキュメントにあります。