我正在尝试从一个文件中导入在其他文件中的类中使用的变量,并最终将其导入到另一个文件中并进行编译。
让我展示问题的重现情况:
数组文件.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/