4

我只是想知道在结构中声明和定义的变量是否可以初始化为某个值,并计划使用函数指针来模仿 OOP 中的类。

示例代码:

typedef struct{
int x;
int (*manipulateX)(int) = &manipulateX;
}x = {0};

void main()
{
    getch();
}

int manipulateX(int x)
{
    x = x + 1;
return x;
}
4

4 回答 4

9

从 C99 开始,您可以使用指定的初始化程序将结构的字段设置为值,如下所示:

struct MyStruct {
    int x;
    float f;
};

void test() {
    struct MyStruct s = {.x=123, .f=456.789};
}
于 2013-01-06T01:07:53.380 回答
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。

http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc03strin.htm

于 2013-01-06T01:09:08.510 回答
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和返回扩展为第一个项目和分号,在这种情况下将定义结构,然后重新定义和返回第二个项目和一个逗号,在这种情况下将定义一个默认实例。太糟糕了,我不知道有什么方法可以避免最后一行与其他行不同(如果每一行但第一行之前有最后一行,则最后一行可以匹配其他行YXYtypedef {CREATE_FOO_STRUCT} FOO;FOOXYXYconst FOO default_FOO = {CREATE_FOO_STRUCT};X, 如果最后一行后面跟着//this line must be left blank一行。

在我实现上述结构的特定处理器上,default_FOO以这种方式定义将消耗零 RAM,并消耗等于default_FOO. 使用常规赋值语句加载具有默认值的静态实例的函数FOO将消耗 ROM 中的每个非零字节的四个字节default_FOO,并且还需要有一个可以使用的静态实例。接受 aFOO*并使用默认值加载指向的实例的 C 语言函数将占用大量代码(每个分配都必须单独计算要存储的数据的地址)。

于 2013-01-09T16:56:49.113 回答
0

在 C 中初始化结构模板内的结构成员是非法的,并且是不允许的.. 因为结构模板不拥有自己的任何内存,并且结构的所有成员只有在与一种结构类型的变量,因为现在它们被分配了一个内存,它们可以被初始化..但不是在与变量关联之前:例如

    struct tag_name
    { 
    int x;
    int y;
    };

上面的 struct 模板不包含内存空间.. 除非有一个变量与它相关联:

    struct tag_name variable1;

现在 struct 类型的变量variable1将被分配一个足够大的内存来保存两个 int 值(forvariable1.xvariable1. y),现在只有你可以初始化成员 x 和 y ,例如:

    variable1.x=10;
    variable1.y=20;

因此以下内容将是非法的

    struct tag_name
    { 
    int x=10;
    int y=20;
    };
于 2013-09-06T13:20:45.660 回答