大多数预处理指令都属于下面3种の一:
对于一个宏要在哪里加圆括号有两条规则
(1)如果宏的替换列表中有运算符那么始终要将替换列表放在括号中间
(2)如果宏有参數,每个参数每次在替换列表中出现时都要放在原括号中
以上为C89的预定义宏C99还有新增的。
这段代码在vc6.0中编译时会出现如下詭异的问题:
按照字面上理解(struct *)0表示将0强制转化为struc *型指针所指向的地址,&(((struct *)0)->e)表示取结构体指针(struct*)0的成员e的地址因为该结构体的首地址为0,所以其实就是得到了成员e距离结构体首地址的偏移量但为啥会出上述错误呢?
根据你的宏定义它所代表的含義就是半个大括号。
你对这个回答的评价是
这么定义宏4102的意义在于:在一个大型的项目内,代1653码被分拆给不同的人写很有可能函数/方法名是需要修改的(为了某种规范),如果不使用宏如果要改,那么修改的量是巨大的,而且可能遗漏要根据编译错误反复查找漏掉的地方,更严重的是万一有重名函数的重载找错更是麻烦。使用宏的优越性就体现出来了
你对这个回答的评价是?
下载百度知道APP搶鲜体验
使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。
大多数预处理指令都属于下面3种の一:
对于一个宏要在哪里加圆括号有两条规则
(1)如果宏的替换列表中有运算符那么始终要将替换列表放在括号中间
(2)如果宏有参數,每个参数每次在替换列表中出现时都要放在原括号中
以上为C89的预定义宏C99还有新增的。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。