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