2013-11-27 87 views
0

我想在头文件中的不同结构定义中声明结构值。所以我在头文件中完成了以下内容。但是编译器给了我在A.H头文件中的错误信息field myStructMember has incomplete type无法在c中的结构中声明结构成员

struct My_A{ 
    int value; 
}; 

在B.h头文件:

struct My_A; // forward declaration 
struct My_B 
    { 
     struct My_A myStructMember; // error is here! 
     int differentValue; 
    }; 

是否有可能一个结构声明中声明结构成员?

编辑: My_A和My_B在不同的头文件中声明。

编辑2: 当我在B.h中添加“A.h”时,它就起作用了。它有任何问题吗? 在B.h头文件:

include "A.h" // added this line insead of forward declaration 
struct My_B 
    { 
     struct My_A myStructMember; // not any error anymore 
     int differentValue; 
    }; 
+0

@BLUEPIXY请参阅我的编辑。他们在不同的头文件中。 – Fer

+2

是的,那不会工作。但是,您可以使'myStructMember'动态(一个指针)并管理.c文件代码中的适当分配。 – WhozCraig

+0

@WhozCraig看到我的第二个编辑。我可以使用这种方法吗? – Fer

回答

1

不是没有#包括B.hA.h(或每次被引用时B.h前 - 当编译器解析My_B否则缺乏确定的My_A大小所需的信息,您可以用一个指针代替,但获得的所有处理他们的开销。

如果你只是想实现的抽象/详细信息隐藏,那么你就可以改变你的My_A所以提前声明,它现在是正确的大小的结构(使用字符数组,例如)。然后你必须确保没有包括A.hB.h,因为这会导致编译器错误。哦,真的确保你得到的大小正确或怪异的事情会发生。有许多方法可以确保使用宏断言这是正确的。

例如make B.h

struct My_A{ 
    char hidden_data[4]; 
}; 

struct My_B 
{ 
    struct My_A myStructMember; 
    int differentValue; 
}; 
+0

看到我的第二个编辑。我可以使用这种方法吗? – Fer

+0

是的。看到我答案的第一句话。不利的一面是,无论何处包含'B.h'(你可能不想这么做),你总是会包含所有'A.h'。 –

1

的错误是什么,它说 - 你不能使用结构,直到你拥有它的完整的类型。你根本不知道它的大小。前向声明在这里没有帮助。

或者,您可以使用指向结构的指针。指针大小是已知的。

+0

当我在B.h中添加“A.h”时,它似乎有效!否则,我想我将不得不使用指针insead。 @aragaer看到我的编辑2 – Fer