我只是想知道在结构中声明和定义的变量是否可以初始化为某个值,是否计划使用函数指针来模拟OOP中的类。
示例COde:
typedef struct{
int x;
int (*manipulateX)(int) = &manipulateX;
}x = {0};
void main()
{
getch();
}
int manipulateX(int x)
{
x = x + 1;
return x;
}
答案 0 :(得分:9)
从C99开始,您可以使用designated initializers将结构字段设置为值,如下所示:
struct MyStruct {
int x;
float f;
};
void test() {
struct MyStruct s = {.x=123, .f=456.789};
}
答案 1 :(得分:0)
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。
答案 2 :(得分:0)
我在编程内存有点紧张的嵌入式系统时使用的一种方法是使用一些宏来定义结构类型并定义其初始值。定义看起来像:
#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
返回到分号,在这种情况下{{1} }将定义结构typedef {CREATE_FOO_STRUCT} FOO;
,然后重新定义FOO
和X
,以便Y
返回第二项,X
返回逗号,在这种情况下{{1}将定义一个默认实例。这太糟糕了,我不知道有什么方法可以避免让最后一行与其他行不同(如果每行,则最后一行可能与其他行匹配,但第一行<{em>前面有{{ 1}},如果最后一行后跟Y
行。
在我实现上述结构的特定处理器上,以这种方式定义const FOO default_FOO = {CREATE_FOO_STRUCT};
将占用零RAM,并消耗等于X
大小的ROM。使用常规赋值语句将使用默认值加载//this line must be left blank
的静态实例的函数将为default_FOO
中的每个非零字节消耗4个字节的ROM,并且还需要有它可以使用的静态实例。接受default_FOO
并使用默认值加载指向实例的C语言函数将占用大量代码(每个赋值必须单独计算要存储的数据的地址)。 / p>
答案 3 :(得分:0)
非法初始化C中结构模板内的结构成员,并且不允许 ..因为结构模板不保存自己的任何内存,并且struct的所有成员只有在与结构类型的变量相关联时才会被分配一个内存空间,并且从现在起它们被分配了一个内存,它们可以被初始化..但是在与变量关联之前没有:例如
struct tag_name
{
int x;
int y;
};
上面的struct模板不包含内存空间..除非变量与它相关联:
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;
};