2016-05-07 8 views
0

MFCアプリケーションには、メモリリークを診断するための定義などがあります。 AFX.Hで2つの定義を確認する方法は同じですか?

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

、DEBUG_NEWとして定義されてどのように新しいをチェックするDEBUG_NEW定義

void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine); 
#define DEBUG_NEW new(THIS_FILE, __LINE__) 

が存在しますか?

私はそれが動作しない

#if defined(new) && new == DEBUG_NEW 

を使用しようとしました。

+0

は、あなたがマクロで結果を使用する必要がありますか、または実行時のチェックが十分であろうか? – ilent2

答えて

3

あなたが質問にMFCアプリケーションコードへのアクセス権を持っている場合は、私が#ifdef contructを変更します

#ifdef _DEBUG 
#define new DEBUG_NEW 
#define NEW_REDEFINED 
#endif 

次にあなたが#ifdef NEW_REDEFINED

+0

MFC cpp/hファイルはMFCウィザードによって自動的に作成され、コード定義も追加されていますので、すべてのファイルを変更する必要があります。この場合のC++ 11/C11の新機能? –

1

にキーワードを再定義のアイデアを使用してチェックを行うことができますマクロはややクレイジーなものです。私はこのMFCのアイデアに従う人はいないことを願っています。その場合、単純な

#ifdef new 

で十分です。デフォルトのnewが使用されている場合、キーワードはマクロとして定義されません。

あなたは後にしている。具体的内容に応じて、別のオプションは、単にnewが及び_DEBUGが定義されている場合だけ、あなたが期待する形で定義されていることを信頼し

#ifdef _DEBUG 

を使用するかもしれません。

しかし、C++には、マクロが特定の形式で定義されているかどうかを示す#if式で実行できるチェックはありません。

+0

より良い解決策と思われます。 –

0

あなたは2つのだけ定義は、実行時に同じであれば、あなたのようなもの使用することができます知っておく必要がある場合:これは、各マクロを定義するために使用される正確な文字列を比較しますので、それが唯一の役に立つかもしれ

#include "string.h" 
#define STR(s) #s 
#define compare(a, b) (strcmp(STR(a), STR(b)) == 0) 

を特定の場合には、考慮してください。

#define MY_INT1 int 
#define MY_INT2 int 
#define MY_INT3 (int) 
#define MY_FLOAT float 

compare(MY_INT1, MY_INT2) // Evaluates to true 
compare(MY_INT1, MY_INT3) // Evaluates to false 
compare(MY_INT1, MY_FLOAT) // Evaluates to false 
+0

OPは結果を '#if'式で使用したいので、これは動作しません。 – hvd

関連する問題