c++ - 警告 : "variable may be used uninitialized in this function" in a multi-mode structured function

标签 c++ c

一个多模结构函数可能是这样的:

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/

相关文章:

c++ - 从 Linux 到 Windows 交叉编译 wxWidgets 代码

c++ - 前置或附加到每个 printf 调用

在 C 中将 32 位和 64 位数字转换为 IEEE 754 二进制

c - 这两种代码有什么区别?

c - 来自加速度计的数据转换

c++ - 在 Mac OSX 中设置 QComboBox 样式

c++ - 'switch' 在 C/C++ 中有哪些有趣的用途?

c++ - 在文件对象的当前位置从文件中删除字符

c++ - 将一维, "flattened"索引转换为N维数组的N维 vector 索引

c - 关于 IEEE 754、64 位双倍的问题?