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;