一个多模结构函数可能是这样的:
void foo(int mode) {
int opt_mode0;
int opt_mode1;
/* init section */
switch (mode) {
case 0:
opt_mode0 = 3;
break;
case 1:
opt_mode1 = 5;
break;
}
/* shared execution section */
bar();
some_more_foo();
/* distinguished execution section */
switch (mode) {
case 0:
foo_mode0(opt_mod0); /* triggers warning of possible uninitialized opt_mod0. */
break;
case 1:
foo_mode1(opt_mod1); /* triggers warning of possible uninitialized opt_mod1. */
break;
}
/* more code here */
}
如您所见,mode
控制着模式,所有变量都在其模式下完美初始化,但编译器无法捕捉逻辑来断定这些变量已初始化。
是否有更清晰的编码风格/模式来避免警告?抑制此警告不是一个选项,因为它会禁用编译器为我捕获未初始化的变量错误。
请注意,这里的示例是一个微型示例。真正的功能可能更复杂。
欢迎使用 C 和 C++ 的解决方案。
==更新:对一些评论的回应===
请把上面的例子看成一个缩影。所以,有人说要合并这两种选项模式:不。如果模式 0 需要 5 个参数,而模式 1 只需要 2 个,并且它们有不同的类型?预初始化所有内容将与抑制警告具有相同的效果:它将禁止编译器捕获“使用未初始化值”错误。
最佳答案
C++ 答案:
使用 std::optional<int>
对于类型。不仅警告会消失,而且您可以依赖 optional
的“未设置”状态对于未设置的情况。
A C 答案:
初始化变量,禁用警告,或编程 std::optional<int>
的一个版本对于 int
类型;它实际上只是一个指针。
关于c++ - 警告 : "variable may be used uninitialized in this function" in a multi-mode structured function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59501246/