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

par*_*ras 13 c++

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

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

小智 24

如果您尝试在多个编译单元(cpp文件)之间共享结构的定义,常见的方法是:将结构的定义放在头文件(mystruct.h)中.如果struct包含任何方法(即它是一个默认情况下所有成员都是public的类),你可以在mystruct.CPP文件中实现它们,或者,如果它们是轻量级的,直接在struct中实现(这使得它们默认为inline)).

mystruct.h:

#ifndef MYSTRUCT_H
#define MYSTRUCT_H

struct MyStruct
{
    int x;
    void f1() { /* Implementation here. */ }
    void f2(); /* Implemented in mystruct.cpp */
};

#endif
Run Code Online (Sandbox Code Playgroud)

mystruct.cpp

#include "mystruct.h"
// Implementation of f2() goes here
void MyStruct::f2() { ... }
Run Code Online (Sandbox Code Playgroud)

您可以在#include任意数量的cpp文件中使用您的结构,只需mystruct.h:

main.cpp中

#include "mystruct.h"
int main()
{
    MyStruct myStruct;
    myStruct.x = 1;
    myStruct.f2();
    // etc...
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您尝试跨多个编译单元共享结构的全局实例(从您的问题中并非绝对清楚),请执行上述操作,同时添加

extern MyStruct globalStruct;
Run Code Online (Sandbox Code Playgroud)

到mystruct.h.这将宣布一个实例可用于外部链接; 换句话说,变量存在但在其他地方初始化(在你的情况下在mystruct.cpp中).将全局实例的初始化添加到mystruct.cpp:

MyStruct globalStruct;

这个很重要.如果不手动创建实例globalStruct,您将得到链接器错误.现在您可以globalStruct从包含mystruct.h的每个编译单元访问.


Dan*_*ner 0

问题是,如果您将包含视为只是代码的导入,那么您基本上会得到两次相同的代码。

您可以使用#ifdef来修复它,请参阅http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html