多模式结构化函数可能如下所示:
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个参数,并且它们具有不同的类型?然后,预初始化一切将具有与抑制警告相同的效果:它将禁用编译器以捕获“使用未初始化值”错误。
发布于 2019-12-27 21:09:42
一个C++答案:
使用std::optional<int>作为类型。警告不仅会消失,而且您可以依靠optional的“未设置”状态来处理未设置的情况。
答案是C:
初始化变量,禁用警告,或者为int类型编写一个版本的std::optional<int>;它实际上只是一个指针。
发布于 2019-12-27 21:22:55
你可以做很多事情,所有这些事情都有它们的成本和好处:
将公共部分提升到它们自己的函数中可能会更进一步。
每个人都会受益,但这对你来说无疑是昂贵的。你在哪里划清界限呢?
大多数编译器提供了简单的方法来在本地隐藏特定的警告,查看它以使您的构建保持安静和相关的警告。
https://stackoverflow.com/questions/59501246
复制相似问题