visual C ++ typedef struct multiply定义的符号问题

时间:2011-09-07 07:48:38

标签: visual-c++ typedef

在Visual C ++中,我遇到了“致命错误LNK1169:找到一个或多个多重定义的符号”,代码如下,如果我想在其他函数用途的两个源文件中包含两个头文件,我该如何解决问题?

main.cpp
========
#include main.h
#include sub.h

sub.cpp
========
#include main.h
#include sub.h

sub.h
=========

typedef struct{
      char colour;
      char name;
}person;

person ssss = { red, ali};

5 个答案:

答案 0 :(得分:3)

您的问题是您在头文件中定义了一个变量:

person ssss = { red, ali };

一个在main.cpp中实例化,一个在sub.cpp中实例化。你最好放一个:

extern person ssss;

在头文件中,然后在其中一个源文件中定义一次变量。这将使两个源文件都知道它存在并且两者都将引用相同的变量,假设这是你想要的。就像其他答案一样,我建议我也建议使用header guards,而你在这个例子中并不特别需要它们,这是一个很好的做法,从长远来看会让你头疼。

答案 1 :(得分:1)

两个源文件中都包含typedef应该不是问题。问题是sss的声明通过sub.h出现在两个文件中。将其放在其中一个源文件中,并在标头中将其声明为外部来修复此问题。请注意,您有链接错误,而不是编译错误 - 这是因为符号在多个目标文件中找到。

答案 2 :(得分:0)

您应该在头文件中添加包含防护,以防止多次包含相同的标头。

#ifndef SUB_H
#define SUB_H


//end of file
#endif

另一件事,你为什么要将main.h包含在你的sub.cpp中?这似乎是错的。

答案 3 :(得分:0)

在sub.h中,在文件顶部插入以下内容;

#pragma once

答案 4 :(得分:0)

person ssss = { red, ali};

sssssub.cppmain.cpp中被提取一次,因为其中任何一个文件都包含sub.h。实例化通常是源文件,而不是头文件。现在,当您访问对象ssss成员变量时,链接器无法访问哪个对象,因为它们都共享相同的范围。

解决方案是拥有一个全局实例(如果这是您想要的),并且可以通过外部链接跨不同文件访问。

main.cpp
========
#include main.h       // What is main.h required for ?
#include sub.h

extern person ssss;

sub.cpp
========
#include main.h       //  ?!?!
#include sub.h

person ssss = { red, ali};

sub.h
=========

typedef struct{
      char colour;
      char name;
}person;