uli*_*tko 10 c++ gcc gcc-warning control-flow
在以下C++代码中:
typedef enum { a, b, c } Test;
int foo(Test test) {
switch (test) {
case a: return 0;
case b: return 1;
case c: return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
编译时发出警告-Wall
,表示控件到达非void函数的结尾.为什么?
一般说来test
示例中的变量可以包含任何值都是正确的.
foo(12354)
不编译:
> test.cpp:15:14: error: invalid conversion from ‘int’ to ‘Test’ > test.cpp:15:14: error: initializing argument 1 of ‘int foo(Test)’
因为12354是不是一个有效的Test
值(虽然它确实会是明文有效Ç,但它不是在C++中).
你肯定可以显式地将任意整数常量强制转换为枚举类型,但是不是认为是未定义的行为吗?
问题是类型的变量Test
可以具有编译器提供的类型所允许的任何值.因此,如果它确定它是一个32位无符号整数,则允许该范围内的任何值.所以,如果比如你打电话foo(123456)
,你的switch
语句不会捕捉任何价值,有没有return
你之后switch
.
default
在您的交换机中添加一个案例或添加一些错误处理代码.
无法保证变量test
将包含有效的枚举,因此实际上您有可能到达非 void 函数的末尾,例如,如果您的调用代码如下所示:
Test test = Test(3);
foo(test);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1587 次 |
最近记录: |