gcc 为什么switch语句中的return语句被视为从函数返回,而不是从switch返回?

qvk1mo1f  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(125)

我在学c++。我试着用g++ main.cpp -o main.exe编译这个:

#include <iostream>

int main()
{
    switch(int x = 2)
    {
        case 2:
            std::cout << "2";
            return;
        default:
            std::cout << "other";
            return;
    }
    return 0;
}

但是,在这种情况下,编译器会产生以下错误:

main.cpp: In function 'int main()':
main.cpp:10:13: error: return-statement with no value, in function returning 'int' [-fpermissive]
   10 |             return;
      |             ^~~~~~
main.cpp:13:13: error: return-statement with no value, in function returning 'int' [-fpermissive]
   13 |             return;
      |             ^~~~~~

因此,我尝试使用-fpermissive选项,如错误消息中所示:g++ main.cpp -o main.exe -fpermissive。现在,编译器产生警告,程序编译成功:

main.cpp: In function 'int main()':
main.cpp:10:13: warning: return-statement with no value, in function returning 'int' [-fpermissive]
   10 |             return;
      |             ^~~~~~
main.cpp:13:13: warning: return-statement with no value, in function returning 'int' [-fpermissive]
   13 |             return;
      |             ^~~~~~

据我所知,这种行为是因为编译器将switch中的return语句确定为离开main函数的信号,但它具有int类型,并且在这种情况下需要返回值。
但为什么它宁愿不确定它作为信号离开开关?
我使用GNU GCC和Windows 10。

wnrlj8wa

wnrlj8wa1#

这个行为是因为编译器在switch中确定return语句,作为离开main函数的信号,但它有int类型,在这种情况下需要返回值。
你的理解是正确的。
但为什么它宁愿不确定它作为信号离开开关?
因为return被指定为从出现该语句的函数返回。
8.7.4. return语句[stmt.return]
1.函数通过return语句返回给它的调用者。
要只留下最接近的switch,可以使用break语句:
8.7.2 break语句[stmt.break]
1.一个break语句应该包含在(8.1)一个迭代语句(8.6)或一个switch语句(8.5.3)中。break语句导致最小的封闭语句终止;控制传递到终止语句之后的语句(如果有的话)。
还有其他的方法可以让switch离开,比如使用goto或者抛出异常,但是break语句是最常用的。

ewm0tg9j

ewm0tg9j2#

我需要使用break而不是return

#include <iostream>

int main()
{
    switch(int x = 2)
    {
        case 2:
            std::cout << "2";
            break;
        default:
            std::cout << "other";
            break;
    }
    return 0;
}

相关问题