我真的很想与GCC附带的c预处理器混淆。请考虑以下代码: //mleak_cpp.h
#ifndef _NO_LEAK_
#define malloc(x) __malloc_debug(__FILE__,__LINE__,x);
“_NO_LEAK_”常量确实只是确保使用普通malloc的__malloc_debug的实现不会被处理并成为递归函数。
// mleak_cpp.cpp
//on top
#include <stdio.h>
#include <string.h>
#define _NO_LEAK_
#include <stdlib.h>
//...rest of the code
//which included __malloc_debug implementation that calls malloc()
这没关系,__malloc_debug里面的malloc就在了,这就是我想要的。出于某种原因,将“stdlib.h”行放在“#define _NO_LEAK_”之上会导致seg-fault。检查预处理器输出后,显然__malloc_debug中的malloc调用被宏替换。
那么导致这种行为的机制是什么?在此先感谢:)
答案 0 :(得分:0)
预处理器实际上只是在编译阶段开始之前替换文本。它只不过是这个。
如果您想查看预处理器的功能,那么您可以指示gcc只预处理文件,然后在该时间点停止。执行此操作的命令是:
g++ -E myfile.cpp
也许会看到#define _NO_LEAK_
之前#include <stdlib.h>
之间的代码差异。
#ifndef _NO_LEAK_
#define malloc(x) __malloc_debug(__FILE__,__LINE__,x);
只有在未定义malloc(x)
的情况下,此代码段才会替换_NO_LEAK
。
答案 1 :(得分:0)
很抱歉浪费你的时间,但我找到了错误的原因。我正在努力的公司使用的是stdlib.h的自定义版本,最后包括mleak_cpp.h,这是导致该行为的原因。因此,更改常量的名称或更改预处理程序指令的顺序会产生影响。 谁见过这个。