我只是想知道在结构中声明和定义的变量是否可以初始化为某个值,并计划使用函数指针来模仿 OOP 中的类。
示例代码:
typedef struct{
int x;
int (*manipulateX)(int) = &manipulateX;
}x = {0};
void main()
{
getch();
}
int manipulateX(int x)
{
x = x + 1;
return x;
}
我只是想知道在结构中声明和定义的变量是否可以初始化为某个值,并计划使用函数指针来模仿 OOP 中的类。
示例代码:
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
, 如果最后一行后面跟着//this line must be left blank
一行。
在我实现上述结构的特定处理器上,default_FOO
以这种方式定义将消耗零 RAM,并消耗等于default_FOO
. 使用常规赋值语句加载具有默认值的静态实例的函数FOO
将消耗 ROM 中的每个非零字节的四个字节default_FOO
,并且还需要有一个可以使用的静态实例。接受 aFOO*
并使用默认值加载指向的实例的 C 语言函数将占用大量代码(每个分配都必须单独计算要存储的数据的地址)。
在 C 中初始化结构模板内的结构成员是非法的,并且是不允许的.. 因为结构模板不拥有自己的任何内存,并且结构的所有成员只有在与一种结构类型的变量,因为现在它们被分配了一个内存,它们可以被初始化..但不是在与变量关联之前:例如
struct tag_name
{
int x;
int y;
};
上面的 struct 模板不包含内存空间.. 除非有一个变量与它相关联:
struct tag_name variable1;
现在 struct 类型的变量variable1
将被分配一个足够大的内存来保存两个 int 值(forvariable1.x
和variable1. y
),现在只有你可以初始化成员 x 和 y ,例如:
variable1.x=10;
variable1.y=20;
因此以下内容将是非法的
struct tag_name
{
int x=10;
int y=20;
};