c++ - 多重声明与未定义

标签 c++ c++11

我正在尝试从一个文件中导入在其他文件中的类中使用的变量,并最终将其导入到另一个文件中并进行编译。

让我展示问题的重现情况:

  • 数组文件.hpp

    int arr[] = {
      1,2,6,5,4,3
    };
    
  • 类文件.hpp

    #include <iostream>
    
    using namespace std;
    
    #include "arrayFile.hpp"
    
    class MyClass{
    private:
        int v1;  
    
    public:
        MyClass();
        void setV(int v);
        int getV();
        int funcM();
    };
    
  • 类文件.cpp

    #include <iostream>
    using namespace std;
    
    #include "classFile.hpp"
    
    MyClass::MyClass(){};
    
    void MyClass::setV(int v){
       v1 = v;
    }
    
    int MyClass::getV(){
       return v1;
    }
    
    int MyClass::funcM(){
       return v1*arr[0];
    }
    
  • 主文件.cpp

    #include <iostream>
    using namespace std;
    
    #include "classFolder/classFile.hpp"
    
    // #include "classFolder/arrayFile.hpp"
    // should i include this?
    
    int main(){
    
        MyClass c;
    
        c.setV(3);
        cout<<c.funcM()<<endl;
    
        cout<<arr[0]<<'*'<<c.getV()<<endl;
    
    }
    

目标是从 classFile.cpp 和 mainfile.cpp 访问数组,但我无法做到这一点。

如果我不在 mainfile.cpp 中包含 arrayFile.cpp:

/tmp/cce4ZHbp.o:(.data+0x0): multiple definition of `arr'
/tmp/ccmsYdmt.o:(.data+0x0): first defined here

如果我这样做:

In file included from mainfile.cpp:5:0:
classFolder/arrayFile.hpp:1:9: error: redefinition of ‘int arr []’
 int arr[] = {
         ^
In file included from classFolder/classFile.hpp:3:0,
                 from mainfile.cpp:4:
classFolder/arrayFile.hpp:1:5: note: ‘int arr [6]’ previously defined here
 int arr[] = {
     ^

我已经能够让编译器告诉我 arr[] 也未定义,但我无法重现此错误。

我做错了什么?

我面临的真正问题是需要我将一个数组和一个结构体导入到一个类中,然后将这个类导入到另一个更大的类中,最后这个类最终被 main 使用。这是我最擅长的复制它。我不知道如何解决这个问题。

最佳答案

您不应在 classFile.hpp 中包含 arrayFile.hpp。仅将其包含在 classFile.cpp 中。此外,在 mainfile.cpp 中(在 main 函数之前)添加行

extern int arr[];

这一行告诉编译器,名为“arr”的 int 类型数组将在其他一些与 mainfile.cpp 链接在一起的 cpp 文件中定义。

像这样编译你的程序:

g++ -std=c++11 -c main.cpp classFile.cpp
g++ -std=c++11 main.o classFile.o
./a.out

第一行单独编译文件(创建 main.o 和 classFile.o 文件) 第二行将它们链接在一起创建一个可执行文件 (a.out) 第三行运行可执行文件

由于添加新文件会使编译过程变得复杂,我建议使用 Makefile。

关于c++ - 多重声明与未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55199286/

相关文章:

c++ - 对成员的 const 引用是否安全

c++ - 从另一个进程获取加载的模块

c++ - UDP/TCP 服务器中监听器线程与工作线程的比率?

c++ - 如何将派生类的成员函数作为回调传递?

c++ - std::is_class 的这种实现是如何工作的?

c++ - 在 MAC OS X 上创建桌面快捷方式(如 .desktop 在 linux 上)

c++ - qmake:将单个cpp文件编译成可执行文件

python - 如何从 C++ 运行 Python 程序

c++ - std::function 作为回调,是否可以注销?

c++ - 列表初始化中元素的评估顺序