在C中重用一段代码

时间:2016-07-05 05:51:30

标签: c

考虑一下:

#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。我们的想法是重用一段经常出现的代码。 这个测试用例根本没有任何意义,但我希望我的意图是明确的。

有没有其他/更好的方法呢?

2 个答案:

答案 0 :(得分:2)

当然还有其他选择。首先,宏的身体并不那么大。比较:

x=y=++z;

bulk_updater;

宏甚至不能保存宝贵的手指或磁盘空间。前者或后者是否更具可读性取决于你(我个人更喜欢前者,因为它清楚语句的作用,而且更紧凑)。

您还可以创建一个能够满足您需求的功能,但是您必须发送参数来执行此操作:

void bulk_updater(int* x, int* y, int *z) {
    *x = *y = ++*z;
}

...

bulk_updater(&x, &y, &z);

这甚至不会节省您的手指或磁盘空间。一如既往,哪个更好是一个意见问题。

通过将xyz放在结构中,可以实现更紧凑的函数版本:

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