私の(アンマネージド)C++コードの中にかなり複雑なマクロがあります。 VSデバッガでマクロを展開する方法はありますか?それともマクロをデバッグする別の方法がありますか?VSでマクロを効率的にデバッグするには?
F.e.私はそれの中にブレークポイントを配置したいと思います。
(はい、私はマクロが悪いことを知っている。)
私の(アンマネージド)C++コードの中にかなり複雑なマクロがあります。 VSデバッガでマクロを展開する方法はありますか?それともマクロをデバッグする別の方法がありますか?VSでマクロを効率的にデバッグするには?
F.e.私はそれの中にブレークポイントを配置したいと思います。
(はい、私はマクロが悪いことを知っている。)
行くのも、「プロパティ」に行くことがあります。 「構成プロパティー」 - >「C/C++」 - >「プリプロセッサ」で、「プリプロセスファイルの生成」を行番号の有無に関係なく任意に設定します。これはあなたのマクロが文脈の中で展開するものを表示します。ライブコンパイル済みのコードでデバッグする必要がある場合は、それをカットアンドペーストし、デバッグ中にマクロの代わりに配置してください。
コンパイラがうまくマクロを展開。 マクロを展開したコンパイルリストを取得します。
コードに拡張マクロを挿入します。 再コンパイルしてください。簡単なテストを行うには、 を実行する必要があります。
一般に、複雑なマクロを構築するときは、まず をハードコードしてテストします。 それをマクロに変換します。 2008の場合
、thisは、右クリックして、プロジェクトやソースファイルのプロパティのいずれかに助け
evilメソッドでevilに対抗します。デバッグを終了するまで、手動でマクロの1つのインスタンスを展開するか、cppユーティリティを使用してすべてのマクロを展開することができますが、Windows版があるかどうかはわかりません。
マクロは非常に複雑だと言いましたか?
をデバッグ中に展開する必要はありませんあまりにも多くのマクロが存在しない場合、私は...すべてのマクロ(それ以外の場合ははっきり読めない)、1つまたは2つの層ではなく拡大したいと思いますデバッグするスニペットの前に#undefするだけで済みます。上記のように[前処理ファイルの生成]でコンパイルしてください。コンパイルは失敗しますが、適切な展開で前処理された出力に使用可能なスナップが得られます。コピーして貼り付け、#undef-sを削除してデバッグします。
は悲しいことに、Cスタイルのマクロに対処するためのあなたの最高の友人はインライン、テンプレートと良い最適化コンパイラです。
私は既存のコードをgrokしようとしていますが、書き換えません。だから、インラインとテンプレートはここで私を助けません。 – liori
インライン関数を使用してください(実際にはインライン展開してください)。これはより効率的です(perfで最適化するとパフォーマンスを引き出す場合にのみインライン化され、メンテナンス可能になります)。あなたはマクロを使用して多くを緩和します:タイプチェック&の安全性。
マクロはコンパイラには存在しません。プリプロセッサ用にのみ使用できます。これは副作用を探すことなくテキストの置換を行います。したがって、マクロは実際には呼び出されず、デバッグできません。どのようにマクロを記述しても、常に誤用が可能です。この例のように:
#define SQUARE(a) ((a)*(a))
注すでに(
`)" SQUARE(3 + 2)のような交換から保護します。しかし、彼らは保護することはできません。
int a = 1;
int b = SQUARE(++a);
一つは、それが4であることを期待するだろうが、あなたは本当に、正方形ではありません6で終わります。 int b = (++a)*(++a);
に展開すると、インライン関数でこの問題は発生しません。
インライン関数の実装は、コンパイラが使用する場所で可視でなければならないことに注意してください。また、初心者にはデバッグが奇妙になります。インライン関数のインスタンスが多数あるため、実行ポイントを別の場所などに移動する場合は、膨大なメソッドリストが必要になります。
私はマクロの悪い面と良い面についてよく知られています。 -1 – liori
はい、できます。
は、Debugフォルダにプリプロセッサによって生成された前処理ファイルを探します。あなたのマクロはtesting.cファイルに書かれているのであれば、前処理ファイルはtesting.iあり
と呼ばれることになる
あなたはマクロが展開されているかを見ることができます。それをデバッグする
は、ちょうどあなたにこのコードをコピー&ペースト:)
あなたは、プリプロセッサによって生成された拡張されたコードを見たい場合は、gccを使用して-Eフラグを使用してそれを得ることができます。あなたがそこに配置したいものは何でもブレークポイント拡大したコードと場所でマクロを使用して、元のソースコードを置き換えることができ
$ gcc -E <source code> -o <preprocessed file name>
:コマンドは次のようになります。
私はその時、私がやっていたことを知っています。しかし、Microsoftのコンパイラの前処理が若干異なる-のための一例であるhttp://social.msdn.microsoft.com/Forums/en-US/23f682bf-8421-474a-aa38-e32f9a0b728f/difference-between-microsoft-visual-studioを見ます-preprocessor-and-gccs;また、私は本当に追加のツールを使用しないことを望んでいました。それは、それをチーム全体に導入する手間です。 – liori
私はhttp://www.codeproject.com/Tips/320721/Macro-expansion-in-VCplusplusからマクロをデバッグする最良の方法を学びました。
そして、私は何を「test.cxx」と私は唯一のマクロとtest.cxxのいくつかの使用例を入れて内部の名前のCXXファイルを作成することです:
#define GetMacro(param1) \
public: void Get##param1(){ return m_##param1; }
GetMacro(MyVariable);
と、コマンドラインで私は次のように入力します。私はoutput.cxxファイルを開くと
c:\ cl /EP test.cxx > output.cxx
は、いくつかの空白行と一番下のマクロ展開があるはず、のように:
public: void GetMyVariable(){ return m_MyVariable; };
コンパイルせずにマクロをテストすることができます。
私は、トピックに関するすべての可能な負の答えを聞いた:
これらはすべて真ですが、毎日のプログラミングの現実と衝突します。
は実際には、マクロは主に単純な機能として使用された古いCプロジェクト、に取り組んで、これは私のために極めて重要となりました。/Pを使ってすべての前処理されたファイルを生成しても、過度の時間と時間がかかります。私はちょうど他のファイルの上または最大で数行定義された簡単なマクロを展開するツールが必要でした。
どうすればよいですか? Linuxの
だから、はい、実用的な意味で、それが可能である私は、Visual Studioにhttps://www.jetbrains.com/resharper-cpp/統合 を使用するWindows上でGDBと彼の拡大のマクロ機能
あなたは(私は試用版があることを信じている)、マクロを使用するCまたはC++プロジェクトで作業Resharper for C++を取得するためのVisual Studioを使用している場合。マクロをクリックして完全に展開したり、段階的に展開したりすることができます。非常に複雑でネストされたマクロがいくつかありますが、それらを理解する唯一の方法です。
マクロは非常に複雑だと言いましたか?私は、1つまたは2つのレイヤーだけを拡張したいと思います。それ以外のマクロは(そうでなければ、はっきりと読み取れません)...デバッグ中です。 – liori
ええ、それは吸うが、私が知っている良い解決策はありません。私は通常、これを行うときに自分自身をちょっとハックする必要があります。手動でコードを置き換えて、必要なレイヤーを取得するか、完全に前処理されたファイルを使って全体を処理します。私は、Visual Studioで前処理さFile'を生成し、 '2013 –
@JimBuckは、前処理を行い、ファイルにありませんか? (または類似のもの..これはVS2015でこれです) – sami1592