C中的链接器错误结构头

时间:2010-11-08 06:51:35

标签: linker structure global

我在标题中有结构声明 globalStruct.h

#ifndef _GLOBALSTRUCT_H
#define _GLOBALSTRUCT_H
typedef struct 
    {

        Int32   frameID;
        Int32   slotIndx;
        Int32   symNumber;

    }   recControlList;     
        recControlList  *recControlListPtr;

#endif

fun.h是

包括“globalStruct.h”

void fun(recControlList * recControlListPtr);

在File1.c中我执行以下操作

#include "globalStruct.h"
#include "fun.h"

recControlList  temp;
recControlListPtr=&temp;

fun( recControlListPtr); //Function prototype is declared in some fun.h file.

fun.c看起来像

#include "globalStruct.h"

void fun(recControlList * recControlListPtr)

我收到链接器错误:_recControlListPtr多次定义。 一个在File1.c和其他fun.c

我不明白这里有什么问题? globalStruct需要extern吗?

由于

2 个答案:

答案 0 :(得分:2)

包括警卫在这里不会帮助你。如果它包含头文件两次但是你在这里有两个完全独立的编译单元,它们将阻止单个编译单元获取两个数据副本。编译器会将recControlListPtr放在目标文件的中。

然后,当您将这些目标文件链接在一起时,链接器会抱怨,因为该符号有两个实例。

您需要做的是确保只存在一个实例。在头文件中,替换:

recControlList  *recControlListPtr;

使用:

extern recControlList  *recControlListPtr;

然后,在一个的C文件中,输入:

recControlList  *recControlListPtr;

底线:尽量避免在头文件中定义任何内容。声明事物(说明它们存在,如原型,externs,typedef,structs等)是可以的,定义(为变量分配空间,给出函数体等等)通常不是。

答案 1 :(得分:0)

如果您在整个程序中多次包含头文件,则必须:

a)对标题

中的声明要更加小心

OR

b)使用包含警卫来确保标题不会被包括两次,请阅读包括警卫IFNDEF和IFDEF以获取更多信息。

PM