首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于宏的有关问题

2013-10-14 
关于宏的问题#include iostreamusing namespace std#defineBAND(x) (((x)5 && (x)10) ? (x) :0)void

关于宏的问题

#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

引用:
Quote: 引用:

宏的参数用++a这样的方式非常的危险,其计算的优先顺序是不确定的,不同的编译器有不同的做法。

Quote: 引用:

#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");

请看上面这段代码,关于其结果我有点不理解,请各位帮忙分析以下。

您能说明白一下”优先顺序不确定“是什么意思吗?您是说++a的求值吗?

[解决办法]
引用:
感谢您的解答,但我对于您的建议不太明白,您能用代码说明一下如何替换吗

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;
}

热点排行