2009-09-07 11 views
13

私の(アンマネージド)C++コードの中にかなり複雑なマクロがあります。 VSデバッガでマクロを展開する方法はありますか?それともマクロをデバッグする別の方法がありますか?VSでマクロを効率的にデバッグするには?

F.e.私はそれの中にブレークポイントを配置したいと思います。

(はい、私はマクロが悪いことを知っている。)

答えて

16

行くのも、「プロパティ」に行くことがあります。 「構成プロパティー」 - >「C/C++」 - >「プリプロセッサ」で、「プリプロセスファイルの生成」を行番号の有無に関係なく任意に設定します。これはあなたのマクロが文脈の中で展開するものを表示します。ライブコンパイル済みのコードでデバッグする必要がある場合は、それをカットアンドペーストし、デバッグ中にマクロの代わりに配置してください。

+0

マクロは非常に複雑だと言いましたか?私は、1つまたは2つのレイヤーだけを拡張したいと思います。それ以外のマクロは(そうでなければ、はっきりと読み取れません)...デバッグ中です。 – liori

+2

ええ、それは吸うが、私が知っている良い解決策はありません。私は通常、これを行うときに自分自身をちょっとハックする必要があります。手動でコードを置き換えて、必要なレイヤーを取得するか、完全に前処理されたファイルを使って全体を処理します。私は、Visual Studioで前処理さFile'を生成し、 '2013 –

+0

@JimBuckは、前処理を行い、ファイルにありませんか? (または類似のもの..これはVS2015でこれです) – sami1592

4

コンパイラがうまくマクロを展開。 マクロを展開したコンパイルリストを取得します。

コードに拡張マクロを挿入します。 再コンパイルしてください。簡単なテストを行うには、 を実行する必要があります。

一般に、複雑なマクロを構築するときは、まず をハードコードしてテストします。 それをマクロに変換します。 2008の場合

thisは、右クリックして、プロジェクトやソースファイルのプロパティのいずれかに助け

+0

私は本当に、自動的にマクロを展開する方法を見つけることができませんでした。私はそれを手で行うことができると知っていますが、私はIDEがそれを行うことができると期待しています... GDBのexpandコマンドのように。 – liori

+0

ソースファイルでCプリプロセッサを実行すると、すべてのマクロを展開できます。プリプロセッサを実行している場合 – n0rd

+0

は別に、それはマクロ/定数(具体的には、プラットフォーム/コンパイラバージョン固有のもの)事前に定義されているかの異なった考えを持っていることがあることに注意してください。私はこれに噛まれた! –

0

evilメソッドでevilに対抗します。デバッグを終了するまで、手動でマクロの1つのインスタンスを展開するか、cppユーティリティを使用してすべてのマクロを展開することができますが、Windows版があるかどうかはわかりません。

0

マクロは非常に複雑だと言いましたか?

をデバッグ中に展開する必要はありませんあまりにも多くのマクロが存在しない場合、私は...すべてのマクロ(それ以外の場合ははっきり読めない)、1つまたは2つの層ではなく拡大したいと思いますデバッグするスニペットの前に#undefするだけで済みます。上記のように[前処理ファイルの生成]でコンパイルしてください。コンパイルは失敗しますが、適切な展開で前処理された出力に使用可能なスナップが得られます。コピーして貼り付け、#undef-sを削除してデバッグします。

は悲しいことに、Cスタイルのマクロに対処するためのあなたの最高の友人はインラインテンプレートと良い最適化コンパイラです。

+0

私は既存のコードをgrokしようとしていますが、書き換えません。だから、インラインとテンプレートはここで私を助けません。 – liori

0

インライン関数を使用してください(実際にはインライン展開してください)。これはより効率的です(perfで最適化するとパフォーマンスを引き出す場合にのみインライン化され、メンテナンス可能になります)。あなたはマクロを使用して多くを緩和します:タイプチェック&の安全性。

マクロはコンパイラには存在しません。プリプロセッサ用にのみ使用できます。これは副作用を探すことなくテキストの置換を行います。したがって、マクロは実際には呼び出されず、デバッグできません。どのようにマクロを記述しても、常に誤用が可能です。この例のように:

#define SQUARE(a) ((a)*(a)) 

注すでに( `)" SQUARE(3 + 2)のような交換から保護します。しかし、彼らは保護することはできません。

int a = 1; 
int b = SQUARE(++a); 

一つは、それが4であることを期待するだろうが、あなたは本当に、正方形ではありません6で終わります。 int b = (++a)*(++a);に展開すると、インライン関数でこの問題は発生しません。

インライン関数の実装は、コンパイラが使用する場所で可視でなければならないことに注意してください。また、初心者にはデバッグが奇妙になります。インライン関数のインスタンスが多数あるため、実行ポイントを別の場所などに移動する場合は、膨大なメソッドリストが必要になります。

+2

私はマクロの悪い面と良い面についてよく知られています。 -1 – liori

0

はい、できます。

は、Debugフォルダにプリプロセッサによって生成された前処理ファイルを探します。あなたのマクロはtesting.cファイルに書かれているのであれば、前処理ファイルはtesting.iあり

と呼ばれることになる

あなたはマクロが展開されているかを見ることができます。それをデバッグする

は、ちょうどあなたにこのコードをコピー&ペースト:)

2

あなたは、プリプロセッサによって生成された拡張されたコードを見たい場合は、gccを使用して-Eフラグを使用してそれを得ることができます。あなたがそこに配置したいものは何でもブレークポイント拡大したコードと場所でマクロを使用して、元のソースコードを置き換えることができ

$ gcc -E <source code> -o <preprocessed file name> 

:コマンドは次のようになります。

+1

私はその時、私がやっていたことを知っています。しかし、Microsoftのコンパイラの前処理が若干異なる-のための一例であるhttp://social.msdn.microsoft.com/Forums/en-US/23f682bf-8421-474a-aa38-e32f9a0b728f/difference-between-microsoft-visual-studioを見ます-preprocessor-and-gccs;また、私は本当に追加のツールを使用しないことを望んでいました。それは、それをチーム全体に導入する手間です。 – liori

3

私は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; }; 

コンパイルせずにマクロをテストすることができます。

3

私は、トピックに関するすべての可能な負の答えを聞いた:

  • マクロは唯一
  • プリプロセッサも
  • ネストされたマクロが過剰に複雑
  • 条件付きにすることができますファイルを含め解析しなければならない評価されていない拡張することができます前処理は厄介なことがあります
  • マクロは邪悪ですただそれらを避けるだけです
  • など....

これらはすべて真ですが、毎日のプログラミングの現実と衝突します。

は実際には、マクロは主に単純な機能として使用された古いCプロジェクト、に取り組んで、これは私のために極めて重要となりました。/Pを使ってすべての前処理されたファイルを生成しても、過度の時間と時間がかかります。私はちょうど他のファイルの上または最大で数行定義された簡単なマクロを展開するツールが必要でした。

どうすればよいですか? Linuxの

  1. は単に

だから、はい、実用的な意味で、それが可能である私は、Visual Studioにhttps://www.jetbrains.com/resharper-cpp/統合 を使用するWindows上でGDBと彼の拡大のマクロ機能

  • を使用しています。

  • 0

    あなたは(私は試用版があることを信じている)、マクロを使用するCまたはC++プロジェクトで作業Resharper for C++を取得するためのVisual Studioを使用している場合。マクロをクリックして完全に展開したり、段階的に展開したりすることができます。非常に複雑でネストされたマクロがいくつかありますが、それらを理解する唯一の方法です。

    関連する問題