C++:宏替换的误区

来源:互联网 发布:淘宝兼职招聘 编辑:程序博客网 时间:2024/06/05 07:01

看下面的代码,输出的结果是什么呢?

#include <iostream>using namespace std;#define NUM 0void fun(){    #undef NUM    #define NUM 100}int main(){    fun();    cout<<"NUM="<<NUM<<endl;//NUM=100;    return 0;}

没错,答案是100,再看下面这段代码:

#include <iostream>using namespace std;#define NUM 0void fun();int main(){    fun();    cout<<"NUM="<<NUM<<endl;//NUM=0;    return 0;}void fun(){    #undef NUM    #define NUM 100}

输出的结果是0,为什么呢?此刻我得出的初步结论是,宏替换并不是扫描全文件然后全部替换,为了解决我的疑问,我把宏处理之后两个函数代码图截取下来了。
这里写图片描述
这里写图片描述
很明显替换结果并不一样。

#include <iostream>using namespace std;void fun();int main(){    fun();    OUT;    //main.cpp:7: error: ‘OUT’ was not declared in this scope        //明显出错了,因为到main函数的时候看不到OUT。    return 0;}void fun(){#define OUT cout<<"hello word"<<endl}//由此可以得出,宏替换并不是在预处理的时候替换所有的宏,//只会替换在main函数之前可见的,如果定义在main函数后面的//宏定义是不会展开的,所以在main里面是看不到宏改变或者宏定义的。
1 0
原创粉丝点击