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

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来修复它,请参见您应该将公共结构移动到头文件,并将该头文件包含在两个文件中。

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

我在main.cpp中全局定义了结构mystruct,现在我想在myfile.cpp中使用这个结构。
当我在头文件中写入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
    文件通常用于定义类/结构和声明方法/函数。