C 预处理器究竟如何应用常量和宏替换

how exactly does the c preprocessor apply constants and macro substitutions?

本文关键字:应用 常量 替换 处理器 预处理 究竟 何应用      更新时间:2023-10-16

我对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,这是导致行为的原因。因此,更改常量的名称或更改预处理器指令的顺序会有所不同。谁能预见到这种情况的到来。