自从很多年前我意识到这在缺省情况下不会产生错误(至少在GCC中),我一直在想为什么?
我知道你可以发出编译器标志来产生一个警告,但它不应该总是一个错误吗?为什么非void函数不返回值是有效的?
评论中要求的一个示例:
#include <stdio.h>
int stringSize()
{
}
int main()
{
char cstring[5];
printf( "the last char is: %c\n", cstring[stringSize()-1] );
return 0;
}
...compiles。
发布于 2009-10-23 05:34:11
默认情况下,gcc不会检查所有代码路径是否都返回值,因为通常不能这样做。它假设你知道你在做什么。考虑一个使用枚举的常见示例:
Color getColor(Suit suit) {
switch (suit) {
case HEARTS: case DIAMONDS: return RED;
case SPADES: case CLUBS: return BLACK;
}
// Error, no return?
}
程序员知道,除非有bug,这个方法总是返回一种颜色。gcc相信你知道你在做什么,所以它不会强迫你在函数的底部放一个return。
另一方面,javac尝试验证所有代码路径是否都返回值,如果不能证明它们都返回值,则抛出错误。此错误是Java语言规范规定的。请注意,有时它是错误的,您必须放入一个不必要的返回语句。
char getChoice() {
int ch = read();
if (ch == -1 || ch == 'q') {
System.exit(0);
}
else {
return (char) ch;
}
// Cannot reach here, but still an error.
}
这是一种哲学上的差异。与Java或C#相比,C和C++是更宽松和更可信的语言,因此新语言中的一些错误在C/C++中是警告,而一些警告在默认情况下被忽略或关闭。
发布于 2015-04-17 02:11:18
我认为这是因为遗留代码(C语言从来不需要返回语句,C++也是如此)。可能有大量的代码库依赖于这个“特性”。但至少在许多编译器上都有-Werror=return-type
标志(包括gcc和clang)。
发布于 2009-10-23 05:25:38
在什么情况下不会产生错误?如果它声明了一个返回类型,但没有返回一些东西,这听起来就像是一个错误。
我能想到的一个例外是main()
函数,它根本不需要return
语句(至少在C++中是这样;我手头上没有这两个C标准)。如果没有return,它将表现为return 0;
是最后一条语句。
https://stackoverflow.com/questions/1610030
复制相似问题