首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在不返回值的情况下流出非void函数的末尾不会产生编译器错误?

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

Stack Overflow用户
提问于 2009-10-23 05:21:24
回答 5查看 62.5K关注 0票数 170

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

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

评论中要求的一个示例:

代码语言:javascript
复制
#include <stdio.h>
int stringSize()
{
}

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

...compiles。

EN

回答 5

Stack Overflow用户

发布于 2009-10-23 05:34:11

默认情况下,gcc不会检查所有代码路径是否都返回值,因为通常不能这样做。它假设你知道你在做什么。考虑一个使用枚举的常见示例:

代码语言:javascript
复制
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语言规范规定的。请注意,有时它是错误的,您必须放入一个不必要的返回语句。

代码语言:javascript
复制
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++中是警告,而一些警告在默认情况下被忽略或关闭。

票数 43
EN

Stack Overflow用户

发布于 2015-04-17 02:11:18

我认为这是因为遗留代码(C语言从来不需要返回语句,C++也是如此)。可能有大量的代码库依赖于这个“特性”。但至少在许多编译器上都有-Werror=return-type标志(包括gcc和clang)。

票数 1
EN

Stack Overflow用户

发布于 2009-10-23 05:25:38

在什么情况下不会产生错误?如果它声明了一个返回类型,但没有返回一些东西,这听起来就像是一个错误。

我能想到的一个例外是main()函数,它根本不需要return语句(至少在C++中是这样;我手头上没有这两个C标准)。如果没有return,它将表现为return 0;是最后一条语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1610030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档