C 转发声明引发重新定义错误

C 转发声明引发重新定义错误,c,struct,compilation,typedef,header-files,C,Struct,Compilation,Typedef,Header Files,我有两个.h文件和一个.c文件,如下所示 a、 h b、 h main.c 编译.c时,它会抛出以下错误- b、 h:17:错误:重新定义typedef“模式信息” a、 h:50:错误:之前的“模式信息”声明在此 专家们,这里出了什么问题?你的b.h typedef struct mode_info_t_ { int primary; int secondary; }mode_info_t; 然后a.h struct common { int

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

a、 h b、 h main.c 编译.c时,它会抛出以下错误-

b、 h:17:错误:重新定义typedef“模式信息”
a、 h:50:错误:之前的“模式信息”声明在此

专家们,这里出了什么问题?

你的b.h

typedef struct mode_info_t_ {
       int primary;
           int secondary;
}mode_info_t;
然后a.h

struct common {
       int create;
       mode_info_t *mode_info;
};
在你的主体中,c只包括b.h

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


    int main()
    {
    }

当我编译您提供的代码段时,我没有收到任何错误和警告。你能给我们看一下你的全部代码吗?可以声明一个结构,然后定义它

typedef struct Node Node;
struct Node {
    int data;
    Node *nextptr;
};
在这里,你也在做同样的事情。所以这不是一个错误。您可能在某个地方处理不当。

将b.h更改为:

struct mode_info_t_ {
    int primary;
    int secondary;
};
如果您需要b.h中的typedef,请让b.h包括a.h。如果您不想让b.h包括a.h,但仍然需要a.h中的typedef,则从a.h中取出typedef并将其放入c.h,让a.h和b.h都包括c.h


实际上,我以前也这样做过,我将所有的转发声明放在一个单独的标题中,只是为了避免在不完全合适的情况下需要不同的标题,包括彼此。

我不是typedef的专家,但您有两次typedefing mode\u info,一次作为另一个变量,一次作为结构。。。还有什么要说的?这正是错误所说的。。。您重新定义了一个类型。虽然不是
struct mode\u info\u
,而是您键入的
mode\u info\u
。@BLUEPIXY您是对的。还有一件事是为什么要对同一个结构多次执行
typedef
。在一个结构中还有一个用户定义的数据类型?如何在a.h中对模式信息进行前向声明?在b.h中,尝试将
typedef struct mode\u info\u t{
更改为
struct mode\u info\u{
(并在结构定义后删除“mode\u info\u t”)因此,您定义
struct mode_info___
而不重复
mode_info_
的typedef,我不能这样做。因为a.h包含在许多其他c文件中,我不想公开b.h。@Jithu然后按照编辑版本中显示的方式来做,我将b.h更改为typedef struct mode_{int primary;int secondary;}模式信息;
 #include "b.h"
    #include "a.h"


    int main()
    {
    }
typedef struct Node Node;
struct Node {
    int data;
    Node *nextptr;
};
struct mode_info_t_ {
    int primary;
    int secondary;
};