我对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__malloc_debug左边是,这就是我想要的。出于某种原因,将"stdlib.h"行放在"#define _NO_LEAK_"的顶部会导致段错误。在检查预处理器输出后,显然__malloc_debug内部的malloc调用被宏替换了。
那么导致这种行为的机制是什么呢?提前致谢:)
预处理器实际上只是在编译阶段开始之前替换文本。它的作用仅此而已。
如果你想看看预处理器做了什么,那么你可以指示gcc只预处理文件,然后在那个时间点停止。执行此操作的命令是:
g++ -E myfile.cpp
也许可以看到代码中的区别 把#define _NO_LEAK_
放在#include <stdlib.h>
之前和之后。
#ifndef _NO_LEAK_
#define malloc(x) __malloc_debug(__FILE__,__LINE__,x);
仅当未定义_NO_LEAK
时,此代码片段才对malloc(x)
进行替换。
很抱歉浪费了你们的时间,但是我已经找到了错误的原因。我工作的公司正在使用自定义版本的stdlib.h,其中末尾包括mleak_cpp.h,这是导致行为的原因。因此,更改常量的名称或更改预处理器指令的顺序会有所不同。谁能预见到这种情况的到来。