【问题标题】:Using struct in different .cpp file在不同的 .cpp 文件中使用结构
【发布时间】:2011-10-16 11:50:57
【问题描述】:

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

我已经在 main.cpp 中全局定义了 struct mystruct,现在我想在 myfile.cpp 中使用这个 struct。 当我在头文件中写入 mystruct 并包含在两个 cpp 文件中时,我得到一个错误,说 mystruct 重新定义。我该如何解决这个问题。

【问题讨论】:

  • 您应该添加一些代码以获得更具体的问题答案。

标签: c++


【解决方案1】:

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

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 文件中使用您的结构,只需 #includemystruct.h:

main.cpp

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

另一方面,如果您尝试在多个编译单元之间共享结构的全局 instance(从您的问题中并不清楚),请按照上述方法执行,但还要添加

extern MyStruct globalStruct;

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

MyStruct 全局结构;

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

【讨论】:

    【解决方案2】:

    如果你想在多个 cpp 文件之间共享任何变量,你应该在 header 中声明它为 extern。并且在 one 的那个 c++ 文件中没有 extern

    如果你不这样做,它将缺乏链接,因为多个对象会有同名的变量。相反,当使用extern 时,一个对象会拥有这个变量,而其他对象会链接它。

    【讨论】:

      【解决方案3】:

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

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

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

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

      查看以下链接了解如何处理这两种情况:

      http://www.adp-gmbh.ch/cpp/forward_decl.html

      头文件也使用了包含保护,所以你可以弄清楚究竟什么可以解决你的问题。

      【讨论】:

        【解决方案4】:

        你应该只在头文件中定义结构,你应该从main.cpp中删除定义

        【讨论】:

        • extern 如果你有一个通用的头文件,则不需要。仅当您希望其他人共享全局结构对象时,才需要 extern。
        • @0A0D,我正是这样理解 Op 的问题的。注意问题中提到的重定义联动错误。
        • 他重新定义了 MyStruct 两次.. extern 不会修复它。 Extern 表示外部链接。编译器稍后将相信程序员将由链接器定位对象。否则,它将引发链接器错误。他没有链接器错误。您应该了解 extern 的工作原理。
        • @0A0D,我知道它是如何工作的,我只是理解错误的问题,好的,有结构重定义,而不是变量。如果您查看我的代码,您会发现我并没有尝试将 extern 应用于结构定义。
        • 不,您将 extern 应用于结构 declaration。无论哪种方式,它都是错误的。
        【解决方案5】:

        标题是您声明struct 将包含的内容(可能是main.cppmyfile.cpp 包含的common.h 文件):

        struct MyStruct {
            int messageID;
            int tempVariable;
        };
        

        在您的main.cpp 中,这是您实际使用结构的地方:

        void someFunction() {
            struct MyStruct tempStruct;
        
            // do something with it
            tempStruct.messageID = 1;
        
        }
        

        不要将struct 的定义同时放在main.hmain.cpp 中 - 否则会出现重新定义错误!

        另外,不要包含 cpp 文件 - 包含头文件(例如 common.h)。如果不了解程序结构的更多信息,就很难提供更好的信息。

        【讨论】:

        • 你为什么要创建一个main.h 文件?此外,.h 文件通常用于定义类/结构和声明方法/函数。
        【解决方案6】:

        标准 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"
        

        【讨论】:

        • @Downvoter,请注意解释原因。我不明白怎么了?
        【解决方案7】:

        声明和定义是两个不同的东西。对于您的情况,您正在为 main.cpp 中的结构分配空间。在你的头文件中,你应该为你的结构使用 extern 修饰符,这样所有包含头文件的文件都将在结构的全局命名空间中查找。希望对您有所帮助。

        【讨论】:

          【解决方案8】:

          您应该将通用结构移动到一个头文件中,并将该头包含在两个文件中。任何其他解决方案都是一种解决方法。

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

            • 为什么这被否决了?根据提问者的说法,这是 IMO 最有可能的答案
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多