看下面的代码,输出的结果是什么呢?
#include <iostream>
using namespace std;
#define NUM 0
void 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 0
void 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里面是看不到宏改变或者宏定义的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-06 21:50:55