首页 > 解决方案 > C:结构声明中是否允许成员之间的操作?

问题描述

我正在尝试使用结构来表示具有三个属性的对象,但第三个属性取决于前两个。所以,我基本上尝试了这个:

typedef struct{
    int x;
    int y;
    int z = x + y;
}xyz_type;

但我得到一个编译器错误。C 语言是否不支持这种行为,或者我错过了这样的正确语法?如果它不受支持,那么实现这样的目标的更好方法是什么?

预期行为:z 将使用其他两个的初始化值之和进行初始化,然后保持独立

标签: cstruct

解决方案


该结构定义了一个类型,而不是一个实例。您不能为类型定义初始化。为此,您需要一个像 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在这种情况下,必须在和之后定义。xy

这不等同于构造函数,因为它必须在每次实例化时显式编码。通过编写宏可以在一定程度上自动化初始化。例如:

#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 ) ;

推荐阅读