C++ 在不同的.cpp文件中使用struct
我在一个项目中有两个.cpp文件,main.cpp和myfile.cpp 我在main.cpp中全局定义了结构mystruct,现在我想在myfile.cpp中使用这个结构。C++ 在不同的.cpp文件中使用struct,c++,unresolved-external,C++,Unresolved External,我在一个项目中有两个.cpp文件,main.cpp和myfile.cpp 我在main.cpp中全局定义了结构mystruct,现在我想在myfile.cpp中使用这个结构。 当我在头文件中写入mystruct并包含在两个cpp文件中时,我得到一个错误,即mystruct redefinition。我应该如何解决这个问题。问题是,如果您将include视为代码的导入,那么基本上会得到两次相同的代码 您可以使用#ifdef来修复它,请参见您应该将公共结构移动到头文件,并将该头文件包含在两个文件中。
当我在头文件中写入mystruct并包含在两个cpp文件中时,我得到一个错误,即mystruct redefinition。我应该如何解决这个问题。问题是,如果您将include视为代码的导入,那么基本上会得到两次相同的代码
您可以使用#ifdef来修复它,请参见您应该将公共结构移动到头文件,并将该头文件包含在两个文件中。任何其他解决方案都是一种变通方法 声明和定义是两件不同的事情。对于您的情况,您正在main.cpp中为您的结构分配空间。在头文件中,应该为结构使用extern修饰符,以便包含头文件的所有文件都将在全局命名空间中查找该结构。希望有帮助。标准C/C++方法:
// source.h
Put all struct, class, typedef, macro definitions, extern variable declaraltions
// source.cpp
Implement the class, functions, define global/external variables
// main.cpp, and other parts of program
#include"source.h"
标题是您声明
结构
所包含内容的位置(可能是main.cpp
和myfile.cpp
包含的common.h
文件):
在main.cpp
中,这是实际使用结构的地方:
void someFunction() {
struct MyStruct tempStruct;
// do something with it
tempStruct.messageID = 1;
}
不要将结构的定义同时放在main.h
和main.cpp
中,否则会出现重新定义错误
另外,不要包括cpp文件-包括头文件(例如,common.h
)。如果不了解更多有关程序结构的信息,就很难提供更好的信息。您应该仅在头文件中定义结构,您应该从main中删除定义。cpp
可能您可以提供有关项目布局的更多信息
根据猜测,您的问题可能是以下两种情况之一:
您需要结构的正向声明
使用“包含防护装置”以防止重新定义
有关如何处理这两个问题,请参见以下链接:
头文件还使用include-guard,因此您可以找出解决问题的确切方法。如果您想在多个cpp文件之间共享任何变量,您应该在头文件中将其声明为外部
。并且在文件> <强> >中,没有<代码> ExtNeX/COD>。p>
如果不这样做,它将缺少链接,因为多个对象将具有同名变量。相反,当使用extern
时,一个对象将有此变量和其他对象链接它。如果您试图在多个编译单元(cpp文件)之间共享结构的定义,常用的方法是:将结构的定义放在头文件(mystruct.h)中。如果结构包含任何方法(即默认情况下它是一个具有所有成员公共的类),则可以在mystruct.CPP文件中实现它们,或者,如果它们是轻量级的,则直接在结构中实现它们(默认情况下,这使它们成为公共的)
mystruct.h:
#ifndef MYSTRUCT_H
#define MYSTRUCT_H
struct MyStruct
{
int x;
void f1() { /* Implementation here. */ }
void f2(); /* Implemented in mystruct.cpp */
};
#endif
mystruct.cpp
#include "mystruct.h"
// Implementation of f2() goes here
void MyStruct::f2() { ... }
您可以在任意多个cpp文件中使用结构,只需#include
mystruct.h:
#ifndef MYSTRUCT_H
#define MYSTRUCT_H
struct MyStruct
{
int x;
void f1() { /* Implementation here. */ }
void f2(); /* Implemented in mystruct.cpp */
};
#endif
main.cpp
#include "mystruct.h"
int main()
{
MyStruct myStruct;
myStruct.x = 1;
myStruct.f2();
// etc...
}
另一方面,如果您正试图在多个编译单元之间共享结构的全局实例(您的问题并不完全清楚),请执行上述操作,但还要添加
extern MyStruct globalStruct;
对我的结构。这将宣布一个具有外部链接的实例可用;换句话说,变量存在,但在别处初始化(在mystruct.cpp中)。将全局实例的初始化添加到mystruct.cpp:
MyStruct globalStruct
这很重要。如果不手动创建globalStruct
的实例,就会出现链接器错误。现在您可以从每个编译单元(包括mystruct.h.@Downvoter)访问globalStruct
,请仔细解释原因。我不明白出了什么问题?如果你有一个通用的头文件,外部是不必要的。只有当您想让其他人共享一个全局结构对象时,才需要使用Extern。@0A0D,我就是这样理解Op的问题的。注意问题中提到的重新定义链接错误。他两次重新定义MyStruct。。extern不会修复它的。Extern是指外部链接。编译器稍后会相信程序员,链接器将定位该对象。否则,它将抛出链接器错误。他没有链接器错误。你应该学习extern是如何工作的。@0A0D,我知道它是如何工作的,我只是错误地理解了这个问题,好吧,这是结构重新定义,不是变量。如果你看我的代码,你会发现我并没有试图将extern
应用于结构定义。不,你是在将extern应用于结构声明。不管怎样,这都是错误的。为什么会被否决?根据提问者的说法,这是最有可能的答案。你应该添加一些代码,以便对你的问题有更具体的答案。你为什么要创建一个main.h
文件?另外,.h
文件通常用于定义类/结构和声明方法/函数。