Visual c++ visualc&x2B+;typdef struct多定义符号问题

Visual c++ visualc&x2B+;typdef struct多定义符号问题,visual-c++,typedef,Visual C++,Typedef,您应该将include-guard添加到头文件中,以防止多次包含同一个头文件 #ifndef SUB_H #define SUB_H //end of file #endif 另一件事,为什么要将main.h包含在sub.cpp中?这似乎是错误的 您应该在头文件中添加include-guard,以防止多次包含同一个头文件 #ifndef SUB_H #define SUB_H //end of file #endif 另一件事,为什么要将main.h包含在sub.cpp中?这似乎是错

您应该将include-guard添加到头文件中,以防止多次包含同一个头文件

#ifndef SUB_H
#define SUB_H


//end of file
#endif

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

您应该在头文件中添加include-guard,以防止多次包含同一个头文件

#ifndef SUB_H
#define SUB_H


//end of file
#endif

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

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

#pragma once

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

#pragma once
ssss
sub.cpp
main.cpp
中被提示一次,因为
sub.h
包含在两个文件中。实例化通常放在源文件中,而不是头文件中。现在,当您访问对象
sss
成员变量时,链接器无法访问哪个对象,因为它们共享相同的作用域

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

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;
ssss
sub.cpp
main.cpp
中被提示一次,因为
sub.h
包含在两个文件中。实例化通常放在源文件中,而不是头文件中。现在,当您访问对象
sss
成员变量时,链接器无法访问哪个对象,因为它们共享相同的作用域

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

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;

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

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

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

person ssss = { red, ali };
一个在main.cpp中实例化,另一个在sub.cpp中实例化。您最好放一个:

extern person ssss;

在头文件中,然后在一个源文件中定义一次变量。这将让两个源文件都知道它存在,并且都引用相同的变量,假设这是您想要的。正如其他答案所建议的那样,我绝对建议您也使用它,尽管在本例中您并不特别需要它们,但这是一种很好的做法,从长远来看将为您省去麻烦。

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

person ssss = { red, ali };
一个在main.cpp中实例化,另一个在sub.cpp中实例化。您最好放一个:

extern person ssss;
在头文件中,然后在一个源文件中定义一次变量。这将让两个源文件都知道它存在,并且都引用相同的变量,假设这是您想要的。就像其他答案所建议的那样,我肯定会建议你也使用它,虽然你并不特别需要它们,但在这个例子中,这是一个很好的实践,从长远来看,它会帮你省去头痛