我在学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。
2条答案
按热度按时间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
语句是最常用的。ewm0tg9j2#
我需要使用
break
而不是return
: