在不同的.cpp文件中使用struct

时间:2011-07-30 10:46:15

标签: c++

我在一个项目中有两个.cpp文件,main.cpp和myfile.cpp

我在main.cpp中有globaly定义的struct mystruct,现在我想在myfile.cpp中使用这个结构。 当我在头文件中编写mystruct并包含在两个cpp文件中时,我得到一个错误,说mystruct重新定义。我应该如何解决这个问题。

9 个答案:

答案 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.hmain.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)

您可以提供有关项目布局的更多信息。

根据猜测,可能你的问题可能是两者之一:

  1. 你想要结构的前向声明。

  2. 使用包含防护来阻止重新定义。

  3. 请参阅以下链接,了解如何处理两者:

    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"