C++函数内部调用函数出现C3861错误求助
解决C3861错误及代码优化建议
核心错误原因
C3861是编译器找不到函数标识符的错误,你的代码里secimm2函数调用了secim(),但secim()的定义在secimm2之后,编译到secimm2时编译器还不知道secim的存在,因此触发该错误。
其他代码问题
main函数重复实现了secim里的菜单逻辑,完全冗余- 字符串输出缺少换行符
\n,导致菜单内容挤在一起 - 存在无效转义字符(比如
"1 adet sayi girin\ "里的多余反斜杠) secimm2的s、n、r参数从未使用,属于无效参数- 函数返回值无实际用途,用
void类型更合理
修复后的完整代码
#include <iostream> using namespace std; // 前置声明:告诉编译器secim函数的存在 void secim(); int fact(int n) { // 计算阶乘 if (n <= 1) return 1; return n * fact(n - 1); } int npr(int n, int r) { // 计算排列数 int pnr = fact(n) / fact(n - r); return pnr; } int combin(int n, int r) { // 计算组合数 int f1 = fact(n); int f2 = fact(r); int f3 = fact(n - r); return f1 / (f2 * f3); } void secimm2() { // 移除无用参数,改为void类型 int ss; cout << "yeniden denemek ister misiniz 1-evet 2-hayir" << endl; cin >> ss; if (ss == 1) { secim(); } } void secim() { // 改为void类型,无需返回值 int s, n, r; cout << "islem seciniz\n1-faktoriyel\n2-perm\n3-kombinasyon\n"; cin >> s; if (s == 1) { cout << "1 adet sayi girin " << endl; cin >> n; cout << fact(n) << endl; secimm2(); } else if (s == 2) { cout << "2 adet sayi girin\n"; cin >> n >> r; cout << npr(n, r) << endl; secimm2(); } else if (s == 3) { cout << "2 adet sayi girin\n"; cin >> n >> r; cout << combin(n, r) << endl; secimm2(); } else { cout << "hatali giris tekrar dene\n" << endl; secimm2(); } } int main() { secim(); // 直接调用secim,删除冗余逻辑 return 0; }
修复说明
- 添加
void secim();前置声明,解决C3861标识符找不到的问题 - 将
secim和secimm2改为void类型,因为它们的返回值没有被实际使用 - 删除
main里的冗余菜单代码,直接调用secim() - 修正字符串中的换行符和无效转义字符
- 移除
secimm2中未使用的参数,精简代码
内容的提问来源于stack exchange,提问作者deadangel13
相关产品推荐
相关产品推荐

