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&lt;char&gt;(std::cout, "\n"));(其中s 是您要逐个字符打印的字符串)。跨度> @JerryCoffin 或者,实际上,只是简单地cout &lt;&lt; key &lt;&lt; '\n'; 不清楚逐个字符这样做的意义。 @IgorTandetnik:照原样,它在每个字符之间插入一个换行符,cout &lt;&lt; key &lt;&lt; '\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返回voidmain 写的没问题。 @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 函数的末尾

错误:控制可能到达非空函数的结尾

在 Xcode 中接收“控制到达非无效函数的末尾”错误消息

Linux C语言编译警告:control reaches end of non-void function

warning: control reaches end of non-void function

如何在 oracle pl sql 中使用 LAG 函数,直到到达非零或最后一行?