考虑一下:
#include<stdio.h>
#define BULK_UPDATER while(1){ \
x=y=++z; \
break; \
}
int main(void)
{
int x,y,z; //defined
x=y=z=100;
BULK_UPDATER;
printf("x : %d y : %d z : %d\n",x,y,z);
return 0;
}
while(1)
循环生成一个完整的语句,因此这里允许#define
。我们的想法是重用一段经常出现的代码。
这个测试用例根本没有任何意义,但我希望我的意图是明确的。
有没有其他/更好的方法呢?
答案 0 :(得分:2)
当然还有其他选择。首先,宏的身体并不那么大。比较:
x=y=++z;
带
bulk_updater;
宏甚至不能保存宝贵的手指或磁盘空间。前者或后者是否更具可读性取决于你(我个人更喜欢前者,因为它清楚语句的作用,而且更紧凑)。
您还可以创建一个能够满足您需求的功能,但是您必须发送参数来执行此操作:
void bulk_updater(int* x, int* y, int *z) {
*x = *y = ++*z;
}
...
bulk_updater(&x, &y, &z);
这甚至不会节省您的手指或磁盘空间。一如既往,哪个更好是一个意见问题。
通过将x
,y
和z
放在结构中,可以实现更紧凑的函数版本:
struct xyz {
int x;
int y;
int z;
};
void bulk_update(struct xyz* p)
{
p->x = p->y = ++p->z;
}
...
struct xyz xyz;
bulk_update(&xyz);
即使它看起来很笨拙,但如果你对xyz
三元组进行更有意义的操作,这可能是合理的。
顺便说一下,它通常建议您使用大写字母表示宏名称(这样一来就知道它是一个宏)。如果你希望它作为一个语句工作,你应该使用do { ... } while(0)
,这样它只会在后面有一个分号才有效,而后面的分号不会使它成为两个语句(正如你的解决方案那样) ):
#define BULK_UPDATER do { x=y=++z; } while(0)
答案 1 :(得分:1)
假设您想使用函数来执行更新,但您不希望函数引入的运行时开销(因为您在函数内部执行了一些小操作)
所以使用macro functions。对于这种情况,
#include<stdio.h>
#define BULK_UPDATER(a,b,c) a = b = ++c
int main(void)
{
int x,y,z; //defined
x=y=z=100;
BULK_UPDATER(x,y,z);
printf("x : %d y : %d z : %d\n",x,y,z);
BULK_UPDATER(x,y,z);
printf("x : %d y : %d z : %d\n",x,y,z);
int x1,y1,z1 = 45;
BULK_UPDATER(x1,y1,z1);
printf("x1 : %d y1 : %d z1 : %d\n",x1,y1,z1);
return 0;
}
输出:
x : 101 y : 101 z : 101
x : 102 y : 102 z : 102
x : 46 y : 46 z : 46