C语言 C99对单个结构变量字段的操作的简写?



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

#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, ...}初始化struct变量,我认为这是一种简写。

我想知道-是否有一些速记语法,这也将允许对相同结构变量的字段进行操作?例如,不要写:

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;

…我可以想象这样的速记语法(下面的伪代码多少受到了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,
};
}

最新更新