首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“静态char THIS_FILE[] = __FILE__;`”的意义是什么?

“静态char THIS_FILE[] = __FILE__;`”的意义是什么?
EN

Stack Overflow用户
提问于 2012-11-07 18:35:35
回答 3查看 4K关注 0票数 14

static char THIS_FILE[] = __FILE__;的意义是什么?

介绍:它是做什么的?它是从哪里来的?

MFC,Microsofts本机类库for Windows,有一个DEBUG_NEW宏,用于跟踪内存分配和它们发生的位置(在用户代码中)。

为此,VS向导将以下代码块放入每个cpp文件中:(不在头文件中)

代码语言:javascript
运行
复制
#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
#endif

调试新宏定义为(在afx.h中):

代码语言:javascript
运行
复制
#define DEBUG_NEW new(THIS_FILE, __LINE__)

整个机器将产生有意义的检漏输出,例如:

代码语言:javascript
运行
复制
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定义为:

代码语言:javascript
运行
复制
#define DEBUG_NEW new(__FILE__, __LINE__)

他们只需将其放置在一个头中,并完成它,而不是在每个文件中使用该ifdef块。

那么,THIS_FILE有什么意义?

(顺便说一句,这正是MS的CRT对malloc_malloc_dbg所做的,其中调试宏在标头crtdbg.h中定义为:

代码语言:javascript
运行
复制
#define   malloc(s)             _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)

)

那么,为什么它要在MFC DEBUG_NEW宏中完成复杂的方式,而简单的方法会工作(更好)?

更新:哈!我最近注意到,VS2005向导没有将THIS_FILE的定义放入生成的cpp文件中。

对此进行调查,似乎是MS在一段时间前就决定不再需要它了,就像在afxtempl.h中定义的那样:

代码语言:javascript
运行
复制
#undef THIS_FILE
#define THIS_FILE __FILE__

尽管如此,我想问题仍然是一样的,为什么它是必要的。(我想当时内存需求的答案是非常有效的。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-07 20:07:00

调试分配器在堆块中存储指向文件名的指针。只需4个字节,而不是每个分配的块也必须为文件名分配空间。

请注意,这可能导致在DLL分配泄漏块时丢失调试信息,并且在生成泄漏报告时卸载DLL。

只有字符数组THIS_FILE在translaton单元中始终是相同的。不是__FILE__,这是字面意思。而且,即使两个文本具有相同的值,也不能保证它们具有相同的地址,这意味着编译器可以为每次使用__FILE__创建一个不同的文字--并耗尽内存。

票数 9
EN

Stack Overflow用户

发布于 2012-11-07 19:51:21

我相信,而且我可能是错的,这是勾勒出已编译的exe中的内存块。如果要获得异常,这将有所帮助,如果您知道dll/exe加载的地址,则可以跟踪内存添加链查找违规代码。

票数 0
EN

Stack Overflow用户

发布于 2012-11-29 08:59:55

__FILE__在整个文件中是相同的,而__LINE__在每一行上都会发生变化。因此,如果文件中有大量调试代码,那么较早的编译器如果没有很好地合并常量,就会有大量不必要的字符串"filename.ext“副本。您可以使用类似-fno-合并常量(对不起,这是gcc CFLAG用于它,不确定VS)来检查差异。大多数编译器现在默认合并常量,因此没有必要使用该定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13275966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档