为什么在不返回值的情况下从非空函数的末尾流出不产生编译器错误?

为什么在不返回值的情况下从非空函数的末尾流出不产生编译器错误?

自从很多年前我意识到这不会在默认情况下产生错误(至少在GCC中),我一直在想为什么?

我知道您可以发出编译器标志来产生警告,但是它不应该总是一个错误吗?为什么不返回值的非空函数是有效的?

评论中要求的一个例子:

#include <stdio.h>int stringSize(){}int main(){
    char cstring[5];
    printf( "the last char is: %c\n", cstring[stringSize()-1] ); 
    return 0;}

.编译.


慕桂英3389331
浏览 593回答 3
3回答

慕斯709654

GCC在默认情况下不会检查所有代码路径是否返回一个值,因为通常不能这样做。它假设你知道你在做什么。考虑使用枚举的常见示例:Color&nbsp;getColor(Suit&nbsp;suit)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(suit)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;HEARTS:&nbsp;case&nbsp;DIAMONDS:&nbsp;return&nbsp;RED; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;SPADES:&nbsp;case&nbsp;CLUBS:&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;BLACK; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Error,&nbsp;no&nbsp;return?}你的程序员知道,除了一个错误,这个方法总是返回一个颜色。GCC相信你知道你在做什么,所以它不会强迫你把回报放在函数的底部。另一方面,javac试图验证所有代码路径都返回一个值,如果不能证明它们都返回值,则抛出一个错误。此错误是Java语言规范强制要求的。请注意,有时它是错误的,您必须放入一个不必要的返回语句。char&nbsp;getChoice()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ch&nbsp;=&nbsp;read(); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ch&nbsp;==&nbsp;-1&nbsp;||&nbsp;ch&nbsp;==&nbsp;'q')&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(0); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(char)&nbsp;ch; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Cannot&nbsp;reach&nbsp;here,&nbsp;but&nbsp;still&nbsp;an&nbsp;error.}这是哲学上的不同。C和C+比Java或C#更容易理解和信任,因此新语言中的一些错误是C/C+中的警告,一些警告默认被忽略或关闭。
打开App,查看更多内容
随时随地看视频慕课网APP