zhwm3064 发表于 2012-1-23 21:10:10

#define后面数字外的括号是不是多余的呢

请教一下

看下面的一个实例,

#define OS_MAX_TASKS   (4)         //每个新建项目必须调整

我看到那个数字4是用括号包括起来的。
我在想,这个括号还有什么用,不用括号,不也一样可以用吗?为什么还要加括号。
#define OS_MAX_TASKS   4         //每个新建项目必须调整

///////////////////////

aheadlead 发表于 2012-1-23 21:15:21

边界效应

aheadlead 发表于 2012-1-23 21:29:09

有时候怕出问题
比如
#define ARUBA 1
#define ARUBB 2
#define ARUBC ARUBA+ARUBB
...
int main()
{
    ...
    int d;
    d = 26 * ARUBC / 34;
    ...
    return(0);
}
...

这样展开后就可能出现歧义
我本来是想让ARUBC等于ARUBA+ARUBB
结果实际上并不是这样,加上括号就好了

rafd 发表于 2012-1-23 21:42:13

我的习惯,有数学_运算,不管默认优先级对不对都加括号
#define ARUBA 1
#define ARUBB 2
#define ARUBC (ARUBA+ARUBB)

zhwm3064 发表于 2012-1-23 21:55:17

回复【2楼】aheadlead 高中SB
-----------------------------------------------------------------------

#define ARUBA 1
#define ARUBB 2
#define ARUBC ARUBA+ARUBB
...
int main()
{
    ...
    int d;
    d = 26 * ARUBC / 34;
    ...
    return(0);
}
...

//////////////////////////////
变成

#define ARUBA (1)
#define ARUBB (2)
#define ARUBC ARUBA+ARUBB
...
int main()
{
    ...
    int d;
    d = 26 * (1)+(2) / 34;
    ...
    return(0);
}
...

我想这照样不会因为在数字外面加上括号,而产生什么好的结果 来

照样出错

zhwm3064 发表于 2012-1-23 22:02:00

这是 时间触发 这本书的 作者用的方法,还有好多书上,资料上,以及官方文档 上面好似也有这样的用法。

可是,我就是想不透,这样用的作用。而且,在同一本书上,有的地方有括号,有的地方就没加括号,好象都行的样子。

BloathX 发表于 2012-1-24 08:30:59

define只是字符替换,没有赋值作用,需注意用处的替换效果

leavic 发表于 2012-1-24 16:30:36

写上会稳妥一点吧,计算机的计算顺序是个很讨厌的东西。

rainyss 发表于 2012-1-24 21:37:32

如果把4换成 5*6 呢?不一定放常数,有可能放表达式.

ddljdd 发表于 2012-1-24 23:07:33

一个原因如2楼所说的那样,可能会产生歧义,所以要在#define ARUBC ARUBA+ARUBB那边加上括号。
另外是,由于上诉原因,要保证代码风格的统一性,所以要在#define 后面的定义都加括号,这是一个很重要也是良好的习惯:
你不能保证每次写#define A 4的时候都不加括号,#define C (A+B)的时候都记得加上括号。写上一百遍就可能失误,一个失误就出大问题了,而且还非常不好查。

blavy 发表于 2012-1-26 14:23:34

当然不是多余的喽,要是你后面是一个公式,你不加上括号的话,他就只是取公式最天始的那个变量了。会出错的。

aheadlead 发表于 2012-1-26 16:15:51

回复【2楼】aheadlead 高中SB
-----------------------------------------------------------------------

#define ARUBA 1
#define ARUBB 2
#define ARUBC ARUBA+ARUBB
...
int main()
{
    ...
    int d;
    d = 26 * ARUBC / 34;
    ...
    return(0);
}
...

//////////////////////////////
变成

#define ARUBA (1)
#define ARUBB (2)
#define ARUBC ARUBA+ARUBB
...
int main()
{
    ...
    int d;
    d = 26 * (1)+(2) / 34;
    ...
    return(0);
}
...

我想这照样不会因为在数字外面加上括号,而产生什么好的结果 来

照样出错


回复【4楼】zhwm3064沉伦蜗牛
-----------------------------------------------------------------------

#define ARUBA 1
#define ARUBB 2
//我的意思是应该在这里加括号 这样这个括号对宏展开后的结果就有影响了
#define ARUBC (ARUBA+ARUBB)
...
int main()
{
    ...
    int d;
    d = 26 * ARUBC / 34;
    ...
    return(0);
}
...


求问如何在论坛里面加粗文字

aheadlead 发表于 2012-1-26 16:24:17

回复【9楼】ddljdd
一个原因如2楼所说的那样,可能会产生歧义,所以要在#define arubc aruba+arubb那边加上括号。
另外是,由于上诉原因,要保证代码风格的统一性,所以要在#define 后面的定义都加括号,这是一个很重要也是良好的习惯:
你不能保证每次写#define a 4的时候都不加括号,#define c (a+b)的时候都记得加上括号。写上一百遍就可能失误,一个失误就出大问题了,而且还非常不好查。
-----------------------------------------------------------------------

正如这位高手所说
有些时候查了一天的错误发现是宏定义的错 人都快给气死了。。。。
总之这是个好习惯 不加白不加。。。加了也没损失。。。硬说要有损失,估计就是编译得久一些罢了吧?^_^

仰望无垠 发表于 2014-5-7 21:44:13

学习了,习惯很重要

bygreencn 发表于 2014-5-7 22:15:26

没有多余,宏定义关键是怕使用时优先级出错,加了也不影响处理速度
页: [1]
查看完整版本: #define后面数字外的括号是不是多余的呢