单独文件中的 C++ 函数不起作用
C++ function in separate file not working
我有一个问题,对于这可能是一个业余问题,我提前表示歉意,但我试图从一个单独的 C++ 文件中包含一个函数,但我遇到了错误。
这是主要代码(嗯,重要的部分):
#include <vector>
using namespace std;
#include "/remote/cronin/jdagosti/Contour/shuffle.cc"
int main() {
vector<double> JD;
vector<double> zenith_deg;
vector<double> azimuth_deg;
vector<double> JD_sh;
vector<double> zen_sh;
vector<double> az_sh;
for(int i = 0; i < 5; ++i){
cout << JD[i] << endl;
}
shuffle(JD,zenith_deg,azimuth_deg,JD_sh,zen_sh,az_sh);
cout << " " << endl;
for(int i = 0; i < 5; ++i){
cout << JD_sh[i] << endl;
}
}
这是我的随机播放功能(在单独的 .cc 文件中):
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
vector<int> array;
for(int j = 0; j < JD.size(); ++j){
array.push_back(0);
}
int index;
srand(time(NULL));
for(int i = 0; i < JD.size(); ++i){
index = floor(JD.size() * rand() / RAND_MAX);
if(array.at(index) == 1){
i -= 1;
continue;
} else {
array.at(index) = 1;
JD_sh.push_back(JD[index]);
}
}
}
这些是我遇到的错误:
shuffle.cc:6:14: error: variable or field ‘shuffle’ declared void
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:14: error: ‘vector’ was not declared in this scope
shuffle.cc:6:21: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:33: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:40: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:56: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:63: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:80: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:87: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:102: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:109: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:125: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:132: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
所以它无法识别主代码中的 header,我向您保证它们都位于同一个文件夹中。另外,我知道 'include' .cc 文件而不是 header 是不好的做法,但我不太熟悉这样做,无论如何,我以前确实看过这项工作。我的印象是,包含包含该函数的 .cc 文件等同于将它放在那里,因此它绝对应该识别早期代码。我注意到的一件事是错误指的是 'shuffle.cc' 而不是它通常所说的,类似于 'from file located in Maps.cc...',也许这与它有关?无论如何,我很困惑,在此先感谢您的帮助!
约书亚
看起来你除了包含它之外实际上还在编译shuffle.cc
文件。 如果您坚持包含源文件,那么也不要编译它。
或者...
不包含源文件,让源文件以标准方式编译和链接,但是您需要在源文件中包含适当的头文件。
附带说明一下,当您修复编译错误时,您的程序将有 未定义的行为。您越界访问 JD
向量。或者至少它看起来是这样的,可能是你把它填在你认为不重要的部分。这样做的问题是,看起来你遇到的问题比实际遇到的要多。请尝试为您以后的问题创建一个Minimal, Complete, and Verifiable Example。
当你将一些文件包含到你的项目中时,你并没有将文件的文本复制到你的主文件中(就像在 JavaScript 中那样),首先编译器将编译每个文件分开,然后 link 它们在一起,所以当你调用 "shuffle.cc" 文件时,你将 link "shuffle.cc" 的编译版本,而不是纯文本,当它编译时没有与 main.cpp 的连接,因此您需要再次包含所有包含和名称空间
所以只需添加:
#include <vector>
using namespace std;
并且应该可以工作
P.S:不要忘记包含 ,我知道在某些 IDE 中,例如 Visual Studio,将毫无问题地编译,但不适用于每个编译器
我有一个问题,对于这可能是一个业余问题,我提前表示歉意,但我试图从一个单独的 C++ 文件中包含一个函数,但我遇到了错误。
这是主要代码(嗯,重要的部分):
#include <vector>
using namespace std;
#include "/remote/cronin/jdagosti/Contour/shuffle.cc"
int main() {
vector<double> JD;
vector<double> zenith_deg;
vector<double> azimuth_deg;
vector<double> JD_sh;
vector<double> zen_sh;
vector<double> az_sh;
for(int i = 0; i < 5; ++i){
cout << JD[i] << endl;
}
shuffle(JD,zenith_deg,azimuth_deg,JD_sh,zen_sh,az_sh);
cout << " " << endl;
for(int i = 0; i < 5; ++i){
cout << JD_sh[i] << endl;
}
}
这是我的随机播放功能(在单独的 .cc 文件中):
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
vector<int> array;
for(int j = 0; j < JD.size(); ++j){
array.push_back(0);
}
int index;
srand(time(NULL));
for(int i = 0; i < JD.size(); ++i){
index = floor(JD.size() * rand() / RAND_MAX);
if(array.at(index) == 1){
i -= 1;
continue;
} else {
array.at(index) = 1;
JD_sh.push_back(JD[index]);
}
}
}
这些是我遇到的错误:
shuffle.cc:6:14: error: variable or field ‘shuffle’ declared void
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:14: error: ‘vector’ was not declared in this scope
shuffle.cc:6:21: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:33: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:40: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:56: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:63: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:80: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:87: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:102: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:109: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:125: error: ‘vector’ was not declared in this scope
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
^
shuffle.cc:6:132: error: expected primary-expression before ‘double’
void shuffle(vector<double> JD, vector<double> zenith, vector<double> azimuth, vector<double> JD_sh, vector<double> zen_sh, vector<double> az_sh){
所以它无法识别主代码中的 header,我向您保证它们都位于同一个文件夹中。另外,我知道 'include' .cc 文件而不是 header 是不好的做法,但我不太熟悉这样做,无论如何,我以前确实看过这项工作。我的印象是,包含包含该函数的 .cc 文件等同于将它放在那里,因此它绝对应该识别早期代码。我注意到的一件事是错误指的是 'shuffle.cc' 而不是它通常所说的,类似于 'from file located in Maps.cc...',也许这与它有关?无论如何,我很困惑,在此先感谢您的帮助!
约书亚
看起来你除了包含它之外实际上还在编译shuffle.cc
文件。 如果您坚持包含源文件,那么也不要编译它。
或者...
不包含源文件,让源文件以标准方式编译和链接,但是您需要在源文件中包含适当的头文件。
附带说明一下,当您修复编译错误时,您的程序将有 未定义的行为。您越界访问 JD
向量。或者至少它看起来是这样的,可能是你把它填在你认为不重要的部分。这样做的问题是,看起来你遇到的问题比实际遇到的要多。请尝试为您以后的问题创建一个Minimal, Complete, and Verifiable Example。
当你将一些文件包含到你的项目中时,你并没有将文件的文本复制到你的主文件中(就像在 JavaScript 中那样),首先编译器将编译每个文件分开,然后 link 它们在一起,所以当你调用 "shuffle.cc" 文件时,你将 link "shuffle.cc" 的编译版本,而不是纯文本,当它编译时没有与 main.cpp 的连接,因此您需要再次包含所有包含和名称空间
所以只需添加:
#include <vector>
using namespace std;
并且应该可以工作
P.S:不要忘记包含 ,我知道在某些 IDE 中,例如 Visual Studio,将毫无问题地编译,但不适用于每个编译器