C99 shorthand 用于对单个结构变量的字段进行操作?

C99 shorthand for operations on fields of a single struct variable?

假设我有这个简单的程序:

#include <stdio.h>

typedef struct foo {
  int bar;
  int baz;
  double qux;
} foo_t;

foo_t my_foo = {
  .bar = 0,
  .baz = 0,
  .qux = 0,
};

int main() {
  my_foo.bar = 100;
  my_foo.baz = my_foo.bar/2 + 4;
  my_foo.qux = my_foo.bar/3.0 + my_foo.baz/5.0;
  printf("Hello, world %f!", my_foo.qux);
  return 0;
}

以上,我正在使用“指定初始化器样式”{ .bar = 0, ...} 来初始化结构变量,我认为这是一种 shorthand.

我想知道 - 是否有一些 shorthand 语法,它也允许对同一结构变量的字段进行操作?例如,而不是写:

  my_foo.bar = 100;
  my_foo.baz = my_foo.bar/2 + 4;
  my_foo.qux = my_foo.bar/3.0 + my_foo.baz/5.0;

...我可以想象这样的 shorthand 语法(下面的伪代码有点受 Python 启发):

with(my_foo) {
  .bar = 100;
  .baz = .bar/2 + 4;
  .qux = .bar/3.0 + .baz/5.0;
}

C(C99,更具体地说)中有这样的东西吗?

C 没有这样的语法。您需要指定结构变量,后跟成员名称。

最接近于此的方法是创建指向每个成员的指针并使用它们。

int *bar = &foo.bar;
int *baz = &foo.baz;
double *qux = &foo.qux;
*bar = 100;
*baz = *bar/2 + 4;
*qux = *bar/3.0 + *baz/5.0;

使用 KISS 原则。意思是坚持简单的现有功能,以创建可读、可维护的代码:

void fooify (foo_t* dst, const foo_t* src)
{
  int bar = src->bar;    
  int baz = src->baz;
  double qux = src->qux;

  bar += 100;
  baz = bar/2 + 4;
  qux = bar/3.0 + baz/5.0;

  *dst = (foo_t) 
  {
    .bar = bar,
    .baz = baz,
    .qux = qux,
  };
}