如何在 c++ 的主类中创建模块
How to create a module in the main class in c++?
我有一个很大的问题,这可能是新手的问题。我的问题是我收到一个错误,指出该方法不是在此范围内创建的,但确实如此。
int main() { //beggining main
int n;
int m;
int result =0;
cout << "Dime m en (m sobre n)" << endl;
cin >> m;
cout << "Dime n:" << endl;
cin >> n;
result = calculate(m,n);
cout << result << endl;
return 0;
} //finish main
int calculate(int m, int n){ //begin calculate
return m+n;
} //finish calculate
当我构建项目时,我得到 "计算" 没有在这个范围内声明 结果 = 计算(m,n); 行 ;
这可能是一件愚蠢的事情,但为什么我会收到此错误?多谢
为什么会出现此错误?
编译器只知道已声明的内容。在它遇到语句的那一点
result = calculate(m,n);
在您的int main()
函数中,它没有遇到符合用法(或在这种情况下的任何用法)的calculate
声明,因此您的程序有问题。
因此,在使用函数之前,您必须告诉编译器您的函数calculate()
。这可以通过将calculate()
的定义移到main()
的定义前面,或者仅仅添加一个声明,告诉编译器这样的函数存在,并在以后提供其主体,如
int calculate(int, int); // make this function known to the compiler
int main() {
/* ... */
result = calculate(m,n); // okay: function is known
/* ... */
}
int calculate(int n, int m) // provide full function definition
{
/* ... */
return result;
}
在这里,calculate()
的声明可能在另一个文件(一个头文件,比如calculate.h
),而calculate()
的完整定义在另一个文件(一个源文件,比如calculate.cc
)。在后一种情况下,您必须确保加载器找到从 main()
调用的正确函数,即您必须将目标文件链接在一起。
向前声明你的calculate
函数,如下所示:
int calculate(int m, int n);
int main() { //beginning main
int n;
int m;
int result =0;
cout << "Dime m en (m sobre n)" << endl;
cin >> m;
cout << "Dime n:" << endl;
cin >> n;
result = calculate(m,n);
cout << result << endl;
return 0;
} //finish main
int calculate(int m, int n){ //begin calculate
return m+n;
}
你必须这样做的原因是因为在 C 和 C++ 中,编译器在遇到对 calculate()
的调用时还不知道你的函数存在。有两种方法可以避免由此行为引起的错误:要么在main
之前定义整个函数及其主体,然后编译器在看到calculate()
调用时将知道所有内容,或者您只需使用所谓的原型声明函数,该原型声明名称, 参数类型,并返回函数的类型,然后稍后定义函数体。此处的代码采用后一种方法。
编译器只能在给定点解析它熟悉的名称。它需要解决对calculate()
调用的点是在代码中提及它之前,因此编译器此时不熟悉它。
要解决此问题,您需要在调用它的函数(即main()
函数)之前(在上面的代码中)声明calculate()
。
通过以下任一方式实现此目的:
-
移动
calculate()
的整个定义,使其位于main()
上方 - 可以位于同一.cpp文件中,也可以位于包含的头文件中。 -
或者,只需在
main()
上方的某个位置声明calculate()
- 可以在同一个.cpp文件中或在包含的头文件中 - 并将定义保留在现在的位置。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- 如何在 Ubuntu 上导入使用 pybind11 创建的模块
- 创建C++ Redis 模块 - "does not export RedisModule_OnLoad() symbol"
- 如何判断我的过程中的哪个模块创建了哪个堆
- 创建用于使用库的 cmake 模块
- 使用 Boost.Python 创建的 Python 模块不会被导入
- 如何为模块化项目正确创建 CMake 文件
- 创建一个生成文件来构建切换的模块
- NodeJS C++本机模块:创建指定的线程池
- 如何在 c++ 的主类中创建模块
- 有没有办法控制英特尔线程构建模块中的线程数量、亲和力和创建时间
- 使用SWIG从Fortran源代码创建Python模块
- 在运行时创建Python3模块,同时初始化嵌入式Python
- 为PCL c++代码创建的boost.python模块的导入错误
- 使用Rcpp创建模块时出错
- 如何在Python中编译、创建共享库和导入c++ boost模块
- 是否可以在C++程序中创建Python模块中定义的类的实例
- Apache+fcgi创建SSE应用程序-如何告诉Apache将所有请求立即转发到fcgi模块