多模式结构化函数可能看起来像这样:
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个参数,并且它们具有不同的类型?这样,对所有内容进行预初始化将具有与抑制警告相同的效果:它将使编译器无法捕获“使用未初始化的值”的错误。
答案 0 :(得分:2)
C ++答案:
使用std::optional<int>
作为类型。警告不仅会消失,而且对于未设置的案例,您可以依靠optional
的“未设置”状态。
C答案:
初始化变量,禁用警告或为std::optional<int>
类型编程int
的版本;确实只不过是一个指针而已。
答案 1 :(得分:0)
您可以做很多事情,包括成本和收益:
如果可能,请尝试合并仅适用于一种模式的部分。虚假警告应该消失。
将公共部分提升到各自的功能中可能会进一步。
如果不可能,请尝试为编译器提供一些更复杂的分析。
每个人都会受益,但这对您来说无疑是昂贵的。在哪里画线?
只需放弃并无条件初始化它。如果这样做很昂贵,那就太糟糕了,而工具将永远无法再在那里发现相关的错误。
只要放弃并忍受虚假的警告。
大多数编译器提供了简便的方法来在本地抑制特定警告,对其进行调查以使构建保持安静并与警告相关。