有什么意义static char THIS_FILE[] = __FILE__;
?
简介:它有什么作用?它从何而来?
MFC 是微软的 Windows 原生类库,有一个DEBUG_NEW
宏可以跟踪内存分配和它们发生的位置(在用户代码中)。
为此,VS 向导将以下代码块放入每个 cpp 文件中:(不在头文件中)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
并且调试新宏定义为(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__)
)
再说一遍,为什么在 MFC 宏中以复杂的方式完成,DEBUG_NEW
而简单的方式可以工作(更好)???
更新:哈!我最近注意到 VS2005 向导没有将定义THIS_FILE
放入生成的 cpp 文件中。
调查一下,似乎 MS 前段时间决定不再需要它了,afxtempl.h
如下定义:
#undef THIS_FILE
#define THIS_FILE __FILE__
尽管如此,我想问题仍然是一样的,为什么它是必要的。(而且我想当时内存要求的答案是非常有效的。)