我在标题中有结构声明 globalStruct.h
#ifndef _GLOBALSTRUCT_H
#define _GLOBALSTRUCT_H
typedef struct
{
Int32 frameID;
Int32 slotIndx;
Int32 symNumber;
} recControlList;
recControlList *recControlListPtr;
#endif
fun.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吗?
由于
答案 0 :(得分:2)
包括警卫在这里不会帮助你。如果它包含头文件两次但是你在这里有两个完全独立的编译单元,它们将阻止单个编译单元获取两个数据副本。编译器会将recControlListPtr
放在目标文件的中。
然后,当您将这些目标文件链接在一起时,链接器会抱怨,因为该符号有两个实例。
您需要做的是确保只存在一个实例。在头文件中,替换:
recControlList *recControlListPtr;
使用:
extern recControlList *recControlListPtr;
然后,在一个的C文件中,输入:
recControlList *recControlListPtr;
底线:尽量避免在头文件中定义任何内容。声明事物(说明它们存在,如原型,externs,typedef,structs等)是可以的,定义(为变量分配空间,给出函数体等等)通常不是。
答案 1 :(得分:0)
如果您在整个程序中多次包含头文件,则必须:
a)对标题
中的声明要更加小心OR
b)使用包含警卫来确保标题不会被包括两次,请阅读包括警卫IFNDEF和IFDEF以获取更多信息。
PM