我在一个项目中有两个.cpp文件,main.cpp和myfile.cpp
我在main.cpp中有globaly定义的struct mystruct,现在我想在myfile.cpp中使用这个结构。 当我在头文件中编写mystruct并包含在两个cpp文件中时,我得到一个错误,说mystruct重新定义。我应该如何解决这个问题。
答案 0 :(得分:22)
如果您尝试在多个编译单元(cpp文件)之间共享结构的定义,常见的方法是:将结构的定义放在头文件中(mystruct.h) )。如果struct包含任何方法(即它是一个默认情况下所有成员都是public的类),你可以在mystruct.CPP文件中实现它们,或者,如果它们是轻量级的,直接在struct中实现它们(这使得它们{{3默认情况下)。
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:
的main.cpp
#include "mystruct.h"
int main()
{
MyStruct myStruct;
myStruct.x = 1;
myStruct.f2();
// etc...
}
另一方面,如果您尝试跨多个编译单元共享结构的全局实例(从您的问题中不是很清楚),请执行上述操作,同时添加
extern MyStruct globalStruct;
到mystruct.h。这将宣布一个实例可用于外部链接;换句话说,变量存在但在其他地方初始化(在你的情况下在mystruct.cpp中)。将全局实例的初始化添加到mystruct.cpp:
MyStruct globalStruct;
这很重要。如果不手动创建globalStruct
的实例,则会出现inline个链接器错误。现在,您可以从包含mystruct.h的每个编译单元访问globalStruct
。
答案 1 :(得分:0)
问题是如果你看到一个include只是代码的导入,你基本上会有两次相同的代码。
您可以使用#ifdef进行修复,请参阅http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html
答案 2 :(得分:0)
您应该将公共结构移动到头文件,并在两个文件中包含该标头。任何其他解决方案都是解决方法。
答案 3 :(得分:0)
宣言和定义是两回事。对于您的情况,您在main.cpp中为您的结构分配空间。在标题中,您应该为结构使用extern修饰符,以便包含头文件的所有文件都将在结构的全局命名空间中查找。希望它有所帮助。
答案 4 :(得分:0)
标题是您声明struct
将包含的内容(可能是common.h
和main.cpp
包含的myfile.cpp
文件):
struct MyStruct {
int messageID;
int tempVariable;
};
在main.cpp
中,这是您实际使用结构的地方:
void someFunction() {
struct MyStruct tempStruct;
// do something with it
tempStruct.messageID = 1;
}
请勿在{{1}}和struct
中添加main.h
的定义 - 否则您将收到重新定义错误!
另外,不要包含cpp文件 - 包括头文件(例如main.cpp
)。如果不了解更多关于程序结构的信息,很难提供更好的信息。
答案 5 :(得分:0)
您应该在头文件 中定义结构,您应该从main.cpp
删除定义
答案 6 :(得分:0)
您可以提供有关项目布局的更多信息。
根据猜测,可能你的问题可能是两者之一:
你想要结构的前向声明。
使用包含防护来阻止重新定义。
请参阅以下链接,了解如何处理两者:
http://www.adp-gmbh.ch/cpp/forward_decl.html
头文件也使用包含警戒,因此您可以找出究竟能解决问题的方法。
答案 7 :(得分:0)
如果要在多个cpp文件之间共享任何变量,则应在标题中将其声明为 extern
。并且在一个的c ++文件中没有extern
。
如果你不这样做,它将缺少链接,因为多个对象将具有相同名称的变量。相反,当使用extern
时,一个对象将拥有此变量,而其他对象将链接它。
答案 8 :(得分:-1)
标准的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"