警告:"Not all control paths return a value" C++
Warning : "Not all control paths return a value" c++
我不明白这个针对我的小功能的警告:
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
Case 1 :
return Fct_1(nb1,nb2);
Case 2 :
return -1;
}
}
如果有人可以帮助我?
正如@NathanOliver 所说,警告意味着可能存在您的函数可能没有 return 任何值的情况。更准确地说,如果用户输入的值不是 1 或 2,那么您的函数不会 return 任何值。
你可能认为你只会输入 1 或 2。但编译器并不知道这一点。
你能做的是-
- 忽略警告 - 您可以忽略警告并继续前进。但请注意,在所有情况下都只将 1 o 2 作为参数。
Though I would not recommend ignoring the warning. In general, it is better to pay heed to the warnings. In the long run, it saves you from many bugs in case you are working on big projects.
- 添加默认值 - 此条件实际上不会执行,但编译器现在将停止发出警告。
这是更正后的代码 -
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return Fct_1(nb1,nb2);
case 2 :
return -1;
default:
return 0;
}
}
或者你可以这样做 -
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return Fct_1(nb1,nb2);
case 2 :
return -1;
}
return 0;
}
在函数末尾添加一个 return XXX,这将确保编译器无论如何都不会在没有 return 值出现的情况下到达函数末尾。
这是因为,正如警告所说,并不是你的代码的所有路径 return 一个值,而函数有一个不同的 return 类型告诉编译器 "hey, I'm going to return something." 但你不如果 Dest
不是 1 或 2,则实际上不会这样做。
您发表评论:
Dest can only be 1 or 2 (it's an enum)
好的,但是只有您知道,您的编译器不知道,它不会相信您的话。它只能看到您代码的静态属性,无法预测运行时将如何进行,因此它不会接受您的代码。据它所知,Dest
可以通过外部代码等进行更改。
您应该添加某种默认值:
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return Fct_1(nb1,nb2);
case 2 :
return -1;
}
return 0;
}
如果 dest
是一个只有两个值的枚举,它没有必要复杂 - return Dest == 1 ? Fct_1(nb1,nb2) : -1;
就足够了。
否则,将 case 2:
替换为 default:
.
如果 Dest
真的像您所说的那样是一个枚举,编译器应该不会在您的情况下发出警告。至少我的编译器没有。所以下面的代码编译时没有 warning/error:
enum {
x = 1,
y = 2
} Dest;
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return -5; //Fct_1(nb1,nb2);
case 2 :
return -1;
}
}
int main() {
}
但是,如果 Dest
是一个整数,或者如果枚举定义了 1
和 2
以外的其他值,那么我也会得到一个错误。然后可以使用 default
-path:
来解决这个问题
enum {
x = 1,
y = 2,
z = 3
} Dest;
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return -5; //Fct_1(nb1,nb2);
case 2 :
return -1;
default:
return 0;
}
}
如果Dest只能是1或2,可以这样改写
int Fct_name (int nb1, int * nb2)
{
if(Dest == 1) return Fct_1(nb1,nb2);
return -1;
}
我不明白这个针对我的小功能的警告:
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
Case 1 :
return Fct_1(nb1,nb2);
Case 2 :
return -1;
}
}
如果有人可以帮助我?
正如@NathanOliver 所说,警告意味着可能存在您的函数可能没有 return 任何值的情况。更准确地说,如果用户输入的值不是 1 或 2,那么您的函数不会 return 任何值。
你可能认为你只会输入 1 或 2。但编译器并不知道这一点。
你能做的是-
- 忽略警告 - 您可以忽略警告并继续前进。但请注意,在所有情况下都只将 1 o 2 作为参数。
Though I would not recommend ignoring the warning. In general, it is better to pay heed to the warnings. In the long run, it saves you from many bugs in case you are working on big projects.
- 添加默认值 - 此条件实际上不会执行,但编译器现在将停止发出警告。
这是更正后的代码 -
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return Fct_1(nb1,nb2);
case 2 :
return -1;
default:
return 0;
}
}
或者你可以这样做 -
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return Fct_1(nb1,nb2);
case 2 :
return -1;
}
return 0;
}
在函数末尾添加一个 return XXX,这将确保编译器无论如何都不会在没有 return 值出现的情况下到达函数末尾。
这是因为,正如警告所说,并不是你的代码的所有路径 return 一个值,而函数有一个不同的 return 类型告诉编译器 "hey, I'm going to return something." 但你不如果 Dest
不是 1 或 2,则实际上不会这样做。
您发表评论:
Dest can only be 1 or 2 (it's an enum)
好的,但是只有您知道,您的编译器不知道,它不会相信您的话。它只能看到您代码的静态属性,无法预测运行时将如何进行,因此它不会接受您的代码。据它所知,Dest
可以通过外部代码等进行更改。
您应该添加某种默认值:
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return Fct_1(nb1,nb2);
case 2 :
return -1;
}
return 0;
}
如果 dest
是一个只有两个值的枚举,它没有必要复杂 - return Dest == 1 ? Fct_1(nb1,nb2) : -1;
就足够了。
否则,将 case 2:
替换为 default:
.
如果 Dest
真的像您所说的那样是一个枚举,编译器应该不会在您的情况下发出警告。至少我的编译器没有。所以下面的代码编译时没有 warning/error:
enum {
x = 1,
y = 2
} Dest;
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return -5; //Fct_1(nb1,nb2);
case 2 :
return -1;
}
}
int main() {
}
但是,如果 Dest
是一个整数,或者如果枚举定义了 1
和 2
以外的其他值,那么我也会得到一个错误。然后可以使用 default
-path:
enum {
x = 1,
y = 2,
z = 3
} Dest;
int Fct_name (int nb1, int * nb2)
{
switch (Dest)
{
case 1 :
return -5; //Fct_1(nb1,nb2);
case 2 :
return -1;
default:
return 0;
}
}
如果Dest只能是1或2,可以这样改写
int Fct_name (int nb1, int * nb2)
{
if(Dest == 1) return Fct_1(nb1,nb2);
return -1;
}