假设我有这样一个简单的程序:
#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,
};
}