重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

关于C++宏定义函数的副作用-创新互联

目录

成都创新互联公司始终坚持【策划先行,效果至上】的经营理念,通过多达10多年累计超上千家客户的网站建设总结了一套系统有效的推广解决方案,现已广泛运用于各行各业的客户,其中包括:成都石凉亭等企业,备受客户赞扬。

宏定义的“Bug”

优先级

变量重复使用

宏定义函数的好处

结语

宏定义的“Bug” 优先级

这是一个很简单的宏定义函数,用于计算n的平方:

#define pf(n) n*n

看似没问题,但...

int a=mul(2+3);

我们希望a的值是25,可他的值却是11!看看他展开后的样子就知道了:

int a=2+3*2+3;

乘法的优先级比加法高,所以先算3*2=6,再算2+6=8,最后算8+3=11。

那变成这样呢?

#define pf(n) (n)*(n)

上面这个例子是没问题了,但如果换成这样:

int a=200/pf(100);

我们又希望a的值为0(取整后的结果),但又事与愿违,他的值为200!

我们再看看他展开后的样子:

int a=200/(100)*(100);

这样原因就很明显了吧:200/100*100=200!

变量重复使用

你或许会说,那再改一下,改成这样:

#define pf(n) ((n)*(n))

这样就安全多了(虽然代码变长了),但还有隐患,并且是光改宏函数改不了的(要改成普通函数才行):

int a=5; //这个值你随便定
int b=pf(++a);

现在我不想再给你搞什么逐步推导,搞循循善诱,该懂得你也懂了,现在我直接把他展开给你看:

int a=5; //这个值你随便定
int b=((++a)*(++a));

错误一目了然,不仅b的值不对,就连a的值也不对。所以只能把pf改成这样:

templateinline T1 pf(T2 n)
{
    return n*n;
}

你看,小小的一个宏定义函数,居然会被搞成这样!

宏定义函数的好处

但有时候宏定义函数还是有用的,比如分配内存:

#define m(a,type) ((type*)malloc((a)*sizeof type)) //注意这里
int main()
{
    int* p1;
    char* p2;
    double* p3;
    p1=m(10,int);
    p2=m(15,char);
    p3=m(105,double);
    //do something......
}

这段代码分配了10个int型变量、15个char型变量、105个double型变量的内存空间,并把开头指针分别赋给p1,p2和p3。

这种功能是一般函数无法做到的(编译报错),所以宏定义函数也不是一无是处。

结语

宏定义函数的限制放宽了很多,带来的影响有好有坏。

宏定义函数有时候可以让代码很短(使用不当的话会很长)。

一般(不是所有)的宏定义函数都可以用inline+模板函数实现(还更安全),但有一些还是做不到的。

但很多所有inline+模板函数都不可以用宏定义替换,所以能不用宏定义函数就不用吧!

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:关于C++宏定义函数的副作用-创新互联
标题来源:http://cqcxhl.com/article/dgegcj.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP