关于宏的问题
#include <iostream>
using namespace std;
#define BAND(x) (((x)>5 && (x)<10) ? (x) :0)
void main()
{
for (int i=4; i<11; i++)
{
int a = i;
cout<<"a = "<<a<<endl<<'\t';
cout<<"BAND(++a) = "<<BAND(++a)<<endl;
cout<<"\t a = "<<a<<endl;
}
printf("\n");
system("pause");
请看上面这段代码,关于其结果我有点不理解,请各位帮忙分析以下。
宏
[解决办法]
你可以学习一下http://bbs.csdn.net/topics/370153775
[解决办法]
感谢您的解答,但我对于您的建议不太明白,您能用代码说明一下如何替换吗
1、BAND(a+1);++a;没问题吧,就是不要在宏的参数中不要用会修改变量值的操作,比如a+=1;a++;这种
2、inline的话是C++为了代替宏而提出的一种方案,因为宏是一种纯粹的文本替换,没有类型检查,这样就会引入很多编译错误,但这些错误却无法在编译前被观察到,只能在编译时或者运行中才能发现。
inline类似于宏,但又不同于宏,准确来说是介于函数和宏之间的产物,当内联成功时会有宏一样的替换,没有调用开销,即使内联失败了,也会像普通函数一样进行调用。而且内联函数,可以像普通函数一样有类型检查,也不必像宏一样写()等等,这样大大减少了编译错误。
当然内联也有一定的缺陷,比如内联一般只支持比较短小的几句语句,如果写的很长就会自动忽略inline,变成普通函数等等。使用频率过高,仍会有空间开销。不过与宏相比,的确是一种不错的代替方案了。
C++中一般建议在非用不可的情况下才会用宏,比如#ifndef之类的预处理命令,当然宏也有宏的好处,不过在使用宏的时候必须谨慎。
你的宏可以这样写:
inline Band(x){
return x > 5 && x < 10 ? x : 0;
}