我已经在几个地方读过可以安全地多次定义C结构,但是我从gcc中获得了“struct的重定义”错误,用于多次定义结构(通过多个包含)。一个非常简单的例子如下所示:
foo.c的:
#include "a.h"
#include "b.h"
int main(int argc, char *argv[]) {
struct bar b;
b.a = 2;
return 0;
}
A.H:
struct bar {
int a;
int b;
};
b.h:
#include "a.h"
struct buz {
int x;
int y;
};
如果我运行gcc foo.c
,我会:
In file included from b.h:1:0,
from foo.c:2:
a.h:1:8: error: redefinition of ‘struct bar’
a.h:1:8: note: originally defined here
我知道我没有放任何包含警卫,那些将修复编译错误,但我的理解是,这应该可行。我还在foo.c中尝试了两个struct bar
定义,我得到了相同的错误消息?那么,结构是否可以在C中定义多次?
答案 0 :(得分:12)
C中的结构可以安全地多次声明 ,但只能定义一次。
struct bar;
struct bar{};
struct bar;
编译很好,因为bar只定义一次,并且可以根据需要多次声明。
答案 1 :(得分:0)
只能为您编译的每个文件定义一次struct。在这里,你要包括a.h两次。 (直接和通过b.h一次。)
您需要更改代码,以便仅为给定的源文件定义符号一次。
答案 2 :(得分:0)
不能不能多次定义它们,这就是为什么#ifndef包含警卫并且应该使用它们的原因。
有
#include "a.h"
在b.h头文件中意味着你重新定义了吧。如果你有#ifndef包含警卫,那就不会发生这种情况。
答案 3 :(得分:0)
您的头文件中没有#ifdef宏。如果将标题包含在多个源文件中,则会遇到该错误。
答案 4 :(得分:0)
同一范围内的相同符号不能定义两次。您可能指的是从两个不同的C文件中包含结构是安全的,这实际上意味着它们被定义了两次(因为没有导出)并且共享这些结构将不会成为问题,因为它们是编译的到相同的内存布局