C++ 函数(错误:控制可能到达非 void 函数的末尾)
Posted
技术标签:
【中文标题】C++ 函数(错误:控制可能到达非 void 函数的末尾)【英文标题】:C++ Functions (error: control may reach end of non void function) 【发布时间】:2014-08-07 23:05:34 【问题描述】:抱歉英语不好,我有关于 c++ 的初学者问题
我写了一个 for 循环来获取字符串中的所有字母:
#include <iostream>
#include <string>
using namespace std;
int main()
string key = "apple";
for(int i = 0; i < key.length(); i++)
cout << key[i] << "\n";
我无法将此操作(列出字符串的所有字符)转换为单独的函数。
#include <iostream>
#include <string>
using namespace std;
string stringiterate(string key)
for(int i = 0; i < key.length(); i++)
cout << key[i] << "\n";
int main()
cout << stringiterate("testing");
虽然这有效,但它给了我错误“警告:控制到达非无效函数的结尾 [-Wreturn-type]"
我知道这与我没有给函数返回值有关。我想知道解决这个问题的最佳实践是什么。我已经阅读了控制中断的其他 SO 帖子,但我不能 100% 确定为什么会出现此错误。
【问题讨论】:
函数已经打印了,为什么还要使用cout
两次?
好点,我改了它仍然有效,愚蠢的错误
请注意,您的stringiterate
几乎等同于调用std::copy
,例如:std::copy(s.begin(), s.end(), std::ostream_iterator<char>(std::cout, "\n"));
(其中s
是您要逐个字符打印的字符串)。跨度>
@JerryCoffin 或者,实际上,只是简单地cout << key << '\n';
不清楚逐个字符这样做的意义。
@IgorTandetnik:照原样,它在每个字符之间插入一个换行符,cout << key << '\n';
显然不会。
【参考方案1】:
功能
string stringiterate(string key)
应该返回string
,但不返回任何内容。
【讨论】:
只需将其更改为void stringiterate()
即可。【参考方案2】:
警告:控制到达非
void
函数的末尾
这个警告或错误总是意味着你有一个函数返回非void
(意思是void
以外的东西),它没有返回语句。如果说一个函数要返回一些东西,它必须有一个 return 语句。但是,在这种情况下,我看不到 return 语句在哪里是必要的,甚至没有帮助。你的函数应该只有 void
作为它的返回类型:
void stringiterate(string key);
此外,即使您修复了该代码,您也会收到另一个错误。这与这一行有关:
cout << stringiterate("testing");
stringiterate
返回void
并且您正在尝试打印它?这对编译器没有意义,因此它会为您发出错误。此外,您的函数已在内部使用cout
,因此无需在函数定义之外使用它。只需自己调用该函数:
stringiterate("testing");
最后,cout
已经具备打印字符串的能力。这样做怎么样:
std::string test = "testing";
std::cout << test;
【讨论】:
谢谢你的解释,很清楚。我希望函数能够遍历字符串的字符,这样我就可以对字符串进行操作,我认为使用 for 循环是可以的,但可能不是最好的方法。【参考方案3】:因为你说你要退货,然后你没有!
int main() // expects an int to be returned
cout << stringiterate("testing");
// Nope. No return statement here.
// Try:
return 0;
与stringiterate
和您原来的main
相同
如果您不想返回任何内容,则返回类型可以为 void(对于 stringiterate
- main 通常预期返回 int
)。例如void stringiterate(string key)
【讨论】:
main
特殊:从末端流出是合法的,相当于return 0;
所以,如果我将字符串 stringiterate 更改为 int,并添加一个 return 0;那里,这是好的做法吗?我以为返回0;隐含在 int main() 中?
如果你不想返回任何有用的东西,只需让stringiterate
返回void
。 main
写的没问题。
@IgorTandetnik ...我在写它的时候确实认为main
附有一些特殊情况的东西。叫我老式的,但如果你说你要返回一些我希望看到返回声明的东西;-)
@VladislavSkovesky void
如果您不想退货,建议/预期的做法。【参考方案4】:
代码应该看起来有点像这样。
#include<iostream>
void stringiterate(std::string key)
for(int i = 0; i < key.length(); i++)
cout << key[i] << "\n";
int main()
stringiterate("testing");
【讨论】:
以上是关于C++ 函数(错误:控制可能到达非 void 函数的末尾)的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 认为由于 if/else 语句中的返回,控制可能会到达非 void 函数的末尾
Linux C语言编译警告:control reaches end of non-void function