c预处理器究竟是如何应用常量和宏替换的呢?

时间:2013-12-18 08:51:48

标签: c++ macros c-preprocessor

我真的很想与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调用被宏替换。

那么导致这种行为的机制是什么?在此先感谢:)

2 个答案:

答案 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,这是导致该行为的原因。因此,更改常量的名称或更改预处理程序指令的顺序会产生影响。 谁见过这个。