c++ - 看不到 "control reaches end of non-void function [-Wreturn-type]"的原因

标签 c++ switch-statement

我现在很确定我的 IDE 搞砸了,它没有始终如一地报告警告,所以我认为第一 block 代码可能没有问题。但是我不确定;如果有帮助,我会使用 Eclipse Juno for C/C++ Developers 和 Mingw setup。

我一直在从 Stroustrup 的优秀书籍编程 - 使用 C++ 的原则和实践中学习 C++。我已经设法通过这个网站和其他网站解决了我的大部分问题,但没有问,但这个问题让我避而不谈:为什么我收到警告“控制到达非无效函数的结尾 [-Wreturn-type]”?

Token get_token(){    // read a token from cin
    char ch;
    cin >> ch;    // note that >> skips whitespace (space, newline, tab, etc.)
    switch (ch) {
 //not yet   case ';':    // for "print"
 //not yet   case 'q':    // for "quit"
    case '(': case ')': case '+': case '-': case '*': case '/': 
        return Token(ch);        // let each character represent itself
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
    {
         cin.putback(ch);         // put digit back into the input stream
         double val;
         cin >> val;              // read a floating-point number
         return Token('8',val);   // let '8' represent "a number"
    }
    default:
        {error("Bad token");
        return 1;}
    }
}

其中有两个警告和三个“没有返回,函数返回非空”。这是怎么回事?后者的一个例子:

double term(){
    double left = primary();
    Token t = get_token();     // get the next token
    while(true) {
        switch (t.kind) {
             case '*':
                 left *= primary();
                 t = get_token();
                 break;
             case '/':
             {    
                  double d = primary();
                  if (d == 0) error("divide by zero");
                     left /= d; 
                  t = get_token();
                  break;
             }
             default: 
                 return left;
        }
    }
}

整个代码可以下载here .

最佳答案

从逻辑上讲,无法到达每个函数的末尾,因为在第一种情况下,您使用默认值 switch(),在每个分支中返回,而在第二种情况下,有一个无限循环,其中没有任何 break 语句。但是,您依赖编译器来解决这个问题(例如通过流分析)。如果它不能那么它会提示你可以在不返回的情况下到达函数的末尾。

我在惠普的编译器上看到过这个,它似乎没有做太多的流分析。 gcc 4.8 不会提示你的这个。但是,如果您想要 (a) 可移植和 (b) 无警告,那么仅添加 return 语句可能会导致当前静默的编译器中出现“无法访问的代码”警告。在我的公司内,我们通过说 RETURN_IF_NO_FLOW_ANALYSIS (0) 来解决这个问题,其中 RETURN_IF_NO_FLOW_ANALYSIS(x) 是一个在 MSVC、gcc 等上计算为空的宏,并且“返回 x;”例如惠普的编译器。这让我们没有警告 - 我们编译时将警告作为错误。虽然不是特别漂亮:如果有人知道更好的解决方法,那么我很感兴趣......

关于c++ - 看不到 "control reaches end of non-void function [-Wreturn-type]"的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22427323/

相关文章:

switch-statement - 动态类型语言中的 Switch case 语句

c# - 为什么 C# switch 语句不能接受 'dynamic' 类型?

function - 我在使用 Haskell 时遇到错误,我无法找到这些案例

c++ - 在 mfc 应用程序中显示数学符号

C++ 浮点显示

c++ - 如何在 C++ 中将模板函数作为参数传递?

switch 语句中的 C++ 函数未执行

c++ - Visual Studio 可能出现错误的编译器错误

传递 container.start() 和 container.end() 的 C++ 更简洁的替代方法

java - 如何在java中的case语句中输入Double值