首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告:在多模式结构化函数中,“变量可能在此函数中未初始化”

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

Stack Overflow用户
提问于 2019-12-27 21:05:04
回答 2查看 897关注 0票数 0

多模式结构化函数可能如下所示:

代码语言:javascript
复制
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个参数,并且它们具有不同的类型?然后,预初始化一切将具有与抑制警告相同的效果:它将禁用编译器以捕获“使用未初始化值”错误。

EN

回答 2

Stack Overflow用户

发布于 2019-12-27 21:09:42

一个C++答案:

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

答案是C:

初始化变量,禁用警告,或者为int类型编写一个版本的std::optional<int>;它实际上只是一个指针。

票数 2
EN

Stack Overflow用户

发布于 2019-12-27 21:22:55

你可以做很多事情,所有这些事情都有它们的成本和好处:

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

将公共部分提升到它们自己的函数中可能会更进一步。

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

每个人都会受益,但这对你来说无疑是昂贵的。你在哪里划清界限呢?

  1. 只是放弃并无条件地初始化它。如果这样做代价高昂,那么这就很糟糕,而且工具再也无法潜在地发现那里的相关错误。

  1. 放弃了,忍受着这个虚假的警告。

大多数编译器提供了简单的方法来在本地隐藏特定的警告,查看它以使您的构建保持安静和相关的警告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59501246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档