前向声明会引发重定义错误

时间:2014-11-16 09:38:24

标签: c struct compilation typedef header-files

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

A.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'的声明在这里

这里的专家怎么了?

3 个答案:

答案 0 :(得分:0)

你有你的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;
};

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

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


    int main()
    {
    }

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

将b.h更改为:

struct mode_info_t_ {
    int primary;
    int secondary;
};

如果你需要b.h中的typedef,请将b.h包含在a.h中。如果你不想让b.h包含a.h但仍需要typedef,那么从a.h中取出typedef并将其放在c.h中,并使a.h和b.h都包含c.h。

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