8

大規模なアプリケーション (数百万の LOC と数万のファイル) があり、メモリ リークを検出するために debug crt を使用しようとしています。私は次のように new をマクロ化しようとしています:

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifndef NEW_DEBUG
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new NEW_DEBUG
#endif

現在、私のアプリは非常に大きいので、理想的には、それをヘッダー ファイルに入れ、具体的には何万もの CPP ファイルに含めます。楽しい仕事ではありません。そのため、これを SDK の共通ヘッダー ファイルに配置しようとしました。これは、すべての翻訳単位に含まれます。

私が直面している問題は、一部の STL ヘッダー ファイルと衝突しているように見え、配置 new を使用するとコンパイラがエラーを出力することです。プラグマを使用して新しいマクロを無効にすることで、自分のコードでそれを変更できます。そこは問題ありません。プレースメント new を使用するのは STL ヘッダー ファイルです。変更できません。

cpp ファイルのインクルード ディレクティブを再配置することで、回避策を見つけました。例えば:

// doesn't compile
#include "new_redirect.h"
#include <map> // for instance

// does compile
#include <map> // for instance
#include "new_redirect.h"

しかし、これは困難な回避策です。繰り返しますが、何千ものファイルを変更し、それらの STL ヘッダーが何よりも先に含まれていることを確認する必要があるためです。皮肉なことに、私はこの問題を具体的にテストするために hello world アプリケーションを作成しました。そして、私の hello-world アプリケーションは正常にコンパイルされました。しかし、この回避策がなければ、私の大規模なアプリはそうではありません。

だから私の質問は:

  1. 大量のコードを動かさずに新しいものを完全にマクロ化できた人はいますか? (比較的痛みのない方法で)
  2. STL ヘッダー インクルード ディレクティブの再配置を回避する他の方法はありますか?

ありがとう

4

1 に答える 1

4

可変引数マクロで新しい配置をキャッチできます。


#define NEW_DEBUG(...) NEW_DEBUG2(_NORMAL_BLOCK, __FILE__, __LINE__, __VA_ARGS__ )
#define new NEW_DEBUG

しかし、プリプロセッサは、引数の有無にかかわらずマクロを定義することを許可していないようで、引数のないマクロが最初に適用されるため、単一のプリプロセッサ パスでこれを行う方法が見つかりませんでした。しかし、上記のマクロと /E を使用して最初のパスを実行し、次に 2 番目のパスを実行すると、2 つでも可能です。


#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define NEW_DEBUG2(...) new(__VA_ARGS__ )
于 2011-02-14T16:04:56.557 に答える