警告:在多模式结构化函数中,“变量可能未在此函数中使用”

时间:2019-12-27 13:05:03

标签: 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个参数,并且它们具有不同的类型?这样,对所有内容进行预初始化将具有与抑制警告相同的效果:它将使编译器无法捕获“使用未初始化的值”的错误。

2 个答案:

答案 0 :(得分:2)

C ++答案:

使用std::optional<int>作为类型。警告不仅会消失,而且对于未设置的案例,您可以依靠optional的“未设置”状态。

C答案:

初始化变量,禁用警告或为std::optional<int>类型编程int的版本;确实只不过是一个指针而已。

答案 1 :(得分:0)

您可以做很多事情,包括成本和收益:

  1. 如果可能,请尝试合并仅适用于一种模式的部分。虚假警告应该消失。

    将公共部分提升到各自的功能中可能会进一步。

  2. 如果不可能,请尝试为编译器提供一些更复杂的分析。

    每个人都会受益,但这对您来说无疑是昂贵的。在哪里画线?

  3. 只需放弃并无条件初始化它。如果这样做很昂贵,那就太糟糕了,而工具将永远无法再在那里发现相关的错误。

  4. 只要放弃并忍受虚假的警告。

    大多数编译器提供了简便的方法来在本地抑制特定警告,对其进行调查以使构建保持安静并与警告相关。