如何在C中的头文件中初始化结构体结构?

时间:2010-12-20 15:16:52

标签: c header struct initialization gnu

我正在尝试将一些旧代码从20年前的DOS系统移植到GNU Linux系统。在他们的几个头文件中(包含在整个地方),它们具有它们声明和初始化的结构体的结构。当我编写遗留代码的方式编译时,我收到警告。关于如何让它保持在同一个头文件中的任何提示?

以下是我对他们正在做的事情的简化示例。

struct A
{

    struct B  temp1;
    struct C  temp2;
};

struct B
{

    int temp3;
    int temp4; 
    int temp5;
};

struct C
{

    int temp6;
    int temp7;
    int temp8;
};


//These are the variables in how they are related to the initialization below

//struct A test_one = {{temp3,temp4,temp5},{temp6,temp7,temp8}};

struct A test_one = {{1,2,3},{4,5,6}};

3 个答案:

答案 0 :(得分:6)

您不应该在头文件中实例化任何结构。如果你这样做,将在每个C文件中创建一个不同的实例,你包含的标题通常不是所需的效果。

在C文件中,您必须执行以下操作。

void foo(){
struct A parent;
struct B child_b;
struct C child_c;

child_b.temp3 = 3;
child_b.temp4 = 4;
child_b.temp5 = 5;

child_c.temp6 = 6;
child_c.temp7 = 7;
child_c.temp8 = 8;

parent.temp1 = child_b;
parent.temp2 = child_c;
}

我会强烈考虑制作与此类似的辅助功能

void initB(struct B* s, int x, int y, int z){
    s->temp3 = x;
    s->temp4 = y;
    s->temp5 = z;
}

如果您希望保留数组初始化语法,请考虑使用union。

答案 1 :(得分:1)

在A之前声明结构B和C,即:

struct B { int temp3; int temp4; int temp5; };
struct C { int temp6; int temp7; int temp8; };
struct A { struct B temp1; struct C temp2; };

答案 2 :(得分:0)

您发布的代码不可编辑,因为使用不完整类型来声明struct成员是非法的。我认为您只是错误地安排了struct定义:BC的定义应该先行。

话虽如此,此代码可以生成的唯一警告是来自链接器的“警告”,如果头文件包含在多个翻译单元中,则可能会抱怨同一对象test_one的多个定义。在C中,这在技术上是非法的,尽管许多编译器允许它作为流行的编译器扩展。

那么,你得到了什么“警告”?