C 预处理器究竟如何应用常量和宏替换
how exactly does the c preprocessor apply constants and macro substitutions?
我对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,这是导致行为的原因。因此,更改常量的名称或更改预处理器指令的顺序会有所不同。谁能预见到这种情况的到来。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 试图在visual studio上用C++创建一个桌面应用程序
- 在cuda线程之间共享大量常量数据
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- c++r值引用应用于函数指针
- 是默认情况下分配给char数组常量的值
- 在C应用程序中运行C++(带有STL)函数
- 在多线程c++服务器应用程序中处理非常量全局配置
- C 预处理器究竟如何应用常量和宏替换
- 常量的应用范围?
- 为什么不能在常量字符 * str 上应用 str.find_last_of( )
- 如何将模板化类型的常量应用到另一个类型
- "Reference qualifier correctness"还是应该将非常量方法应用于右值?