我想知道在结构体内声明和定义的变量能否被初始化为特定值,我打算使用函数指针来模拟面向对象编程中的类。
示例代码:
typedef struct{
int x;
int (*manipulateX)(int) = &manipulateX;
}x = {0};
void main()
{
getch();
}
int manipulateX(int x)
{
x = x + 1;
return x;
}
我想知道在结构体内声明和定义的变量能否被初始化为特定值,我打算使用函数指针来模拟面向对象编程中的类。
示例代码:
typedef struct{
int x;
int (*manipulateX)(int) = &manipulateX;
}x = {0};
void main()
{
getch();
}
int manipulateX(int x)
{
x = x + 1;
return x;
}
从C99开始,您可以使用指定初始化器将结构体的字段设置为特定的值,如下所示:
struct MyStruct {
int x;
float f;
};
void test() {
struct MyStruct s = {.x=123, .f=456.789};
}
StructName s; // receives no initialization
StructName s = {x,y}; // value initializes all members
struct Child { StructName s; };
Child c; // receives no initialization
Child c = {x,y}; // value initializes all members
For Example :
struct Child{
int c;
int d;
}
Child childstruct ={10,20};
那么childstruct.c将是10,childstruct.d将是20。
当我在编写内存有限的嵌入式系统时,我使用过一种方法,即使用一些宏来定义结构类型并定义其初始值。定义大致如下:
#define CREATE_FOO_STRUCT \
X(int age, 34) Y \
X(int height, 65) Y \
X(char const * favoritecolor,"blue") Y \
X(int some_things[5],ARR5(1,2,3,4,5))
需要使用ARR5
宏来允许将该数组的初始化值作为单个参数传递;另一种方法是将最后一行写成X(int some_things[5],{1 COMMA 2 COMMA 3 COMMA 4 COMMA5})
。有了上述宏,就可以定义X
和Y
,使X
扩展为第一个项目,Y
扩展为分号,这样typedef {CREATE_FOO_STRUCT} FOO;
将定义结构FOO
,然后重新定义X
和Y
,使X
返回第二个项目,Y
返回逗号,这样const FOO default_FOO = {CREATE_FOO_STRUCT};
将定义默认实例。很遗憾我不知道如何避免需要让最后一行与其他行不同(如果每行除了第一行之外都在X
之前,并且如果最后一行后面跟着一个//此行必须留空
行,则最后一行可以与其他行匹配)。
default_FOO
将不会消耗任何RAM,并且将消耗ROM大小等于default_FOO
。 使用传统赋值语句加载带有默认值的FOO
静态实例的函数,每个default_FOO
中的非零字节将消耗四个字节的ROM,并且还需要存在可以使用的静态实例。 接受FOO*
并将指向的实例加载默认值的C语言函数将需要大量的代码(每个赋值必须单独计算要存储的数据的地址)。 struct tag_name
{
int x;
int y;
};
上述结构模板不占用内存空间.. 除非将变量与其关联,如下:
struct tag_name variable1;
现在变量variable1
的结构类型将被分配足够大的内存来容纳两个int值(用于variable1.x
和variable1.y
),现在只有您可以初始化成员x和y,例如:
variable1.x=10;
variable1.y=20;
因此,以下内容将是非法的。
struct tag_name
{
int x=10;
int y=20;
};