【问题标题】:Forward declaration throws redefinition error前向声明引发重定义错误
【发布时间】:2014-11-16 09:38:23
【问题描述】:

我有两个 .h 文件和一个 .c 文件,如下所示

啊.h

typedef struct mode_info_t_ mode_info_t;

struct common {
    int create;
    mode_info_t  *mode_info;
}; 

b.h

typedef struct mode_info_t_ {
    int primary;
    int secondary;
} mode_info_t;

main.c

#include "a.h"
#include "b.h"

-----

.c 编译时会抛出以下错误 -

b.h:17:错误:重新定义 typedef 'mode_info_t'
a.h:50: 错误:'mode_info_t' 的先前声明在这里

专家这里有什么问题?

【问题讨论】:

  • 我不是 typedef 方面的专家,但您要对 mode_info_t 进行两次类型定义,一次是作为另一个变量,一次是作为结构......还有什么要说的?
  • 这正是错误所说的......你重新定义了一个类型。不是struct mode_info_t_,而是mode_info_t,你已经输入了它。
  • @BLUEPIXY 你是对的。还有一件事是为什么要为同一个结构多次执行typedef。并且在结构中还有用户定义的数据类型?
  • 如何在 a.h 中为 mode_info_t 做前向声明?
  • 在 b.h 中,尝试将 typedef struct mode_info_t_ { 更改为 struct mode_info_t_ {(并在结构定义后删除“mode_info_t”),这样您就可以定义 struct mode_info_t_ 而无需重复 mode_info_t 的 typedef

标签: c struct compilation typedef header-files


【解决方案1】:

将 b.h 更改为:

struct mode_info_t_ {
    int primary;
    int secondary;
};

如果您需要 b.h 中的 typedef,请让 b.h 包含 a.h。如果你不想让 b.h 包含 a.h 但仍然需要 typedef 在两者中,则将 typedef 从 a.h 中取出并放入 c.h,并让 a.h 和 b.h 都包含 c.h。

实际上我之前已经这样做了,我将所有前向声明放在一个单独的标题中,只是为了避免在不完全合适时需要各种标题。

【讨论】:

  • 是的,我把 b.h 改成了 typedef struct mode_info_t_ { int primary;国际中学; } mode_info;
【解决方案2】:

你有你的 b.h

typedef struct mode_info_t_ {
       int primary;
           int secondary;
}mode_info_t;

然后啊.h

struct common {
       int create;
       mode_info_t *mode_info;
};

在你的 main.c 中只包含 b.h

 #include "b.h"
    #include "a.h"


    int main()
    {
    }

【讨论】:

  • 我不能这样做。因为 a.h 包含在我不想公开 b.h 的许多其他 c 文件中。
  • @Jithu 然后按照编辑版中的方式进行操作
【解决方案3】:

当我编译你给出的 sn-p 时,我没有收到任何错误和警告。你能告诉我们你的完整代码吗?可以声明一个结构,然后定义它。

typedef struct Node Node;
struct Node {
    int data;
    Node *nextptr;
};

在这里,您正在做同样的事情。所以这不是错误。您可能在某个地方处理不当。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多