c - C:结构声明中是否允许成员之间的操作?
问题描述
我正在尝试使用结构来表示具有三个属性的对象,但第三个属性取决于前两个。所以,我基本上尝试了这个:
typedef struct{
int x;
int y;
int z = x + y;
}xyz_type;
但我得到一个编译器错误。C 语言是否不支持这种行为,或者我错过了这样的正确语法?如果它不受支持,那么实现这样的目标的更好方法是什么?
预期行为:z 将使用其他两个的初始化值之和进行初始化,然后保持独立
解决方案
该结构定义了一个类型,而不是一个实例。您不能为类型定义初始化。为此,您需要一个像 C++ 提供的构造函数,但不是 C。
但是,您可以在结构自己的初始化程序中引用结构的实例:
typedef struct
{
int x;
int y;
int z;
} xyz_type ;
xyz_type instance =
{ 10, // x = 10
5, // y = 5
instance.x + instance.y } ; // z = 15
instance.x = 0 ; // x = 0, z is unchanged
您可以明确说明在初始化程序中分配了哪些成员:
xyz_type instance = { .x=10,
.y=5,
.z=instance.x+instance.y} ;
这在具有其他成员的更复杂的结构中很有用,但是顺序仍然很关键- 成员按照它们在定义中struct
定义的顺序分配,而不是它们在初始化程序中出现的顺序,所以z
在这种情况下,必须在和之后定义。x
y
这不等同于构造函数,因为它必须在每次实例化时显式编码。通过编写宏可以在一定程度上自动化初始化。例如:
#define XYZ_INIT( xinit, yinit ) {.x=(xinit),\
.y=(yinit),\
.z=(xinit)+(yinit)}
然后;
xyz_type instance = XYZ_INIT( 10, 5 ) ;
由于宏可能有问题,并且不是类型安全的,因此您可能更喜欢下面的初始化函数:
xyz_type create_xyz(int x, int y)
{
return (xyz_type){ .x = x, .y = y, .z = x + y };
}
然后:
xyz_type instance = create_xyz( 10, 5 ) ;