可以多次定义C结构吗?

时间:2012-04-09 14:54:49

标签: c struct

我已经在几个地方读过可以安全地多次定义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中定义多次?

5 个答案:

答案 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文件中包含结构是安全的,这实际上意味着它们被定义了两次(因为没有导出)并且共享这些结构将不会成为问题,因为它们是编译的到相同的内存布局