我正在尝试将一些旧代码从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}};
答案 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
定义:B
和C
的定义应该先行。
话虽如此,此代码可以生成的唯一警告是来自链接器的“警告”,如果头文件包含在多个翻译单元中,则可能会抱怨同一对象test_one
的多个定义。在C中,这在技术上是非法的,尽管许多编译器允许它作为流行的编译器扩展。
那么,你得到了什么“警告”?