のポイントはstatic char THIS_FILE[] = __FILE__;
何ですか?
はじめに:それは何をしますか?それはどこから来たのですか?
Microsoft の Windows 用ネイティブ クラス ライブラリである MFC には、DEBUG_NEW
メモリ割り当てとそれらが発生した場所 (ユーザー コード内) を追跡するマクロがあります。
これが機能するために、VS ウィザードは次のコード ブロックをすべての cpp ファイルに入れます: (ヘッダー ファイルではありません)。
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
そして、debug new マクロは次のように定義されます (in afx.h
):
#define DEBUG_NEW new(THIS_FILE, __LINE__)
機械全体で、次のような意味のある漏れ検出出力が得られます。
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {615} normal block at 0x04081CE0, 56 bytes long.
Data: <¬9Í] > AC 39 CD 5D 13 00 00 00 13 00 00 00 01 00 00 00
c:\my\dev\path\myfile.cpp(237) : {614} normal block at 0x04087FC0, 4 bytes long.
Data: <ð > F0 1C 08 04
Object dump complete.
それで、もう一度質問は何ですか?
私が困惑しているのは、THIS_FILE
char 配列の目的です。機械は意味がありません。彼らが次のように定義した場合DEBUG_NEW
:
#define DEBUG_NEW new(__FILE__, __LINE__)
ifdef
すべてのファイルにそのブロックを含める代わりに、ヘッダーに配置するだけで完了できます。
それで、のポイントはTHIS_FILE
何ですか?
(ちなみに、これはまさに MS の CRT が行うことでmalloc
あり_malloc_dbg
、ヘッダーでデバッグ マクロが次のように定義されている場所crtdbg.h
です。
#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
)
DEBUG_NEW
繰り返しますが、単純な方法が (より良い) 機能するのに、MFC マクロで複雑な方法が行われるのはなぜですか?
更新:ハ!私は最近、VS2005 ウィザードがの定義を生成された cpp ファイルに入れていないことに気付きました。THIS_FILE
それを調査すると、MS はしばらく前にafxtempl.h
、次のように定義されているように、もう必要ないと判断したようです。
#undef THIS_FILE
#define THIS_FILE __FILE__
それでも、なぜそれが必要だったのかという疑問は変わらないと思います。(そして、当時のメモリ要件の答えはかなり有効だと思います。)