Linker C中的链接器错误结构头

Linker C中的链接器错误结构头,linker,structure,global,Linker,Structure,Global,我在标题中有结构声明 全球结构 #ifndef _GLOBALSTRUCT_H #define _GLOBALSTRUCT_H typedef struct { Int32 frameID; Int32 slotIndx; Int32 symNumber; } recControlList; recControlList *recControlListPtr; #e

我在标题中有结构声明 全球结构

#ifndef _GLOBALSTRUCT_H
#define _GLOBALSTRUCT_H
typedef struct 
    {
        
        Int32   frameID;
        Int32   slotIndx;
        Int32   symNumber;

    }   recControlList;     
        recControlList  *recControlListPtr;

#endif
有趣,h是

包括“globalStruct.h” 无效乐趣(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.
有趣。c看起来像

#include "globalStruct.h"
无效乐趣(recControlList*recControlListPtr)

我收到链接器错误:\ recControlListPtr已定义多次。 一个在File1.c中,另一个在fun.c中

我不明白这里怎么了?全球结构需要外人吗


谢谢

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

a) 对标题中的声明要更加小心

b) 放置包含防护装置以确保标题不会被包含两次,请阅读包含防护装置IFNDEF和IFDEF以了解更多信息


PM

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

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

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

recControlList  *recControlListPtr;
与:

然后,在其中一个C文件中,放入:

recControlList  *recControlListPtr;


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

嗨更正:我有条件的#define guard(忘了在代码段中输入)我仍然有这个错误我已经格式化了你的代码粘贴。你也能发布有趣的东西吗?嗨,Paxdiablo!谢谢,它解决了这个问题。我不知道这个错误是否与此有关,但我曾在某个地方读到结构不是“外部的”。现在我按照你的建议放了extern,一切都很好。。有关于外部结构的输入吗?或者我误读了……嗯,我不确定上下文,但extern会应用于类型结构的变量。而不是结构定义本身。快速搜索web会发现很多情况,人们试图外部化特定结构类型的变量,但类型定义无效。这是我唯一能想到的。如果你能给我指一个特定的地方,我可以看看。
recControlList  *recControlListPtr;