【发布时间】:2013-12-18 08:51:47
【问题描述】:
我对 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_”之上会导致段错误。检查预处理器输出后,显然 __malloc_debug 中的 malloc 调用已被宏替换。
那么导致这种行为的机制是什么?在此先感谢:)
【问题讨论】:
-
看起来很奇怪。如果您使用的是 GCC,您可以通过“gcc -E”或“g++ -E”运行代码并查看该行上方或下方的
<stdlib>有何变化。 -
C 还是 C++?它们在预处理阶段非常相似,但我们不要将两者混为一谈。
-
以下划线后跟大写字母 (
_NO_LEAK_) 的名称和包含两个连续下划线的名称保留给实现(编译器及其库)。不要使用它们。 -
这个问题似乎是题外话,因为它由于使用了自定义版本的 stdlib.h 而需要本地化
-
@bummi 我不认罪,因为我不知道是这样的
标签: c++ macros c-preprocessor