对于C中新定义的结构的extern

时间:2012-01-18 18:26:00

标签: c compilation extern

我主要在其中使用节点结构但定义节点并且它的操作操作被定位在名为NODE /

的目录中的文件中

我创建了NODE / node.h,其中包含:

typedef struct node node;

struct node
{
        int my_reg;
        node *left;
        node *right;
} ;

我创建了NODE / node.c并在其中包含node.h,其中包含node_insert node_remove;

但是我在school_address.c中使用节点struction,其中我还包括NODE / node.h和NODE / node.c

我尝试了

extern struct node

在school_address.c

然而代码没有编译并抱怨node.h中的重新定义

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

extern用于变量,而不是类型定义。您应该只在所有需要了解struct node的模块中包含标题;它取代了整个标题的内容,内联。

做的是在另一个C文件中包含C文件。相反,您应该在标题中声明常用函数的原型。

如,

#include "node.h"

int main()
{
    // whatever
}
如果你将node_insert的原型放在标题中,

就会变成

typedef struct node node;

struct node
{
        int my_reg;
        node *left;
        node *right;
};

struct node *node_insert(struct node *, int);  // or whatever the prototype is

int main()
{
    // whatever
}

在C预处理器完成后,struct nodenode_insertmain中可见。

答案 1 :(得分:1)

您正在寻找Include Guard

具体来说,使用

#ifndef node_h_
#define node_h_ 1

在node.h的开头,和相应的

#endif

最后。

另外,请勿包含.c个文件。

答案 2 :(得分:0)

当您的头文件包含在多个C文件中时,您必须将它们包含在预处理程序指令中以避免双重定义,例如:

#ifndef __NODE_H_INCLUDED__
#define __NODE_H_INCLUDED__

struct node...

#endif

最好在所有头文件中执行此操作。