c++ error:crosses initialization of问题解决分析

 更新时间:2023年08月17日 11:23:40   作者:会灰的飞猫  
这篇文章主要介绍了c++ error:crosses initialization ofde 问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

最近在写代码的时候,碰到了 crosses initialization of ... 的问题,只因我在 switch 的某个 case 分支下定义了一个变量,于是乎便将这个问题整理一下。

1 switch case 的某个分支下定义了变量

switch case 是我们在工作中常见的分支语句,如果在某个分支下不恰当的使用了局部变量,就有可能出现本文提到的问题。

1.1 问题代码示例

#include <iostream>
void switchTest(int code);
int main() {
    switchTest(1);
}
void switchTest(int code) {
    switch (code) {
    case 1:
        int myNum = 0;
        break;
    case 2:
        break;
    default:
        break;
    }
}

上述代码,我在第一个 case 分支下定义了 myNum 变量,尝试编译,出现如下错误。主要看 C2360 这一行,myNum 的初始化操作由 case标签跳过,也就是说当 code !=1 的时候,不会进行 myNum 的初始化。第一反应是“我这个 myNum 只在 case 1 下用啊,不初始化就不初始化嘛,反正其他地方又不用”。

呃,这就牵扯到变量的作用范围了。myNum 这个局部变量的作用范围是从定义处开始直到 switch 语句结束

通俗说,就算我们跳过了 case 1 处的初始化,myNum 在后面的分支中,也是可以被访问到的,被访问到就有可能被使用(虽然我们自己没打算在后面使用,但编译器认为这是有风险的),但是我们又没有对其进行初始化,那这就会出问题。那这个问题怎么处理呢?

1.2 问题的解决

方法一、限定 myNum 的作用域

void switchTest(int code) {
    switch (code)
    {
    case 1:
    {
        int myNum = 0;
        break;
    }
    case 2:
        break;
    default:
        break;
    }
}

我们给 case 1 加上大括号,明确告诉编译器,它只在 case 1 里有效,我们在后面不使用这个 myNum 了,这种方式应该是最符合我们本意的,编译正常通过。

方法二、提前 myNun 的初始化

void switchTest(int code) {
    int myNum = 0;
    switch (code)
    {
    case 1:
        break;
    case 2:
        break;
    default:
        break;
    }
}

既然 myNum 不被初始化的原因的是在 case 分支里定义了局部变量,那么我们将 myNum 的初始化提到 switch 外面吧,这样一来,在它的作用域内,myNum 就肯定会被初始化了,上述问题也同样不会发生了。这样虽然解决了问题,但却扩大了变量的作用范围。如果我们确定只在某个分支下使用这个变量,这种方案就不太可取。

方法三、将用到该变量的分支放到最后,且去掉 default 分支

void switchTest(int code) {
    switch (code)
    {
    case 2:
        break;
    case 1:
        int myNum = 0;
        break;
    }
}

上面这种写法是能编译过的,而且满足我的意图。我把 case 1 放到了最后一个分支,这样一来,myNum 的作用域就只是在最后一个分支了,在 myNum 的作用域内,它都是被初始化了的,因此是不会出问题的。

当然,这样写只是为了说明,出现这个错误的根因是:变量在其作用范围内,可能不会被初始化。(项目中请勿这样操作,一不小心就是一口大锅)

2 goto 跳过了变量的初始化

goto 语句的使用率并不高,但使用出 bug 的概率却极高。

2.1 问题代码示例

#include <iostream>
void gotoTest();
int main()
{
    gotoTest();
}
void gotoTest() {
    goto label;
    int myNum = 1;
    label: std::cout << "goto the label" << std::endl;
}

上面的代码里,我们使用 goto 跳过了 myNum 的初始化,不出意外的出了意外,编译时出现如下错误,原因和我们上面 switch 的例子是一样的,那解决方法自热也是类似的。

2.2 问题的解决

方法一、限定 myNum 的作用域

void gotoTest() {
    goto label;
    {
        int myNum = 1;
    }
    label: std::cout << "goto the label" << std::endl;
}

限制 myNum 的作用域,告诉编译器我们在后面不使用了。

方法二、提前 myNun 的初始化

void gotoTest() {
    int myNum = 1;
    goto label;
    label: std::cout << "goto the label" << std::endl;
}

将 myNum 的初始化提前,确保不会因为 goto 导致跳过了初始化。

结论

crosses initialization of 翻译过来就是跳过了初始化,根本原因是变量在其作用范围内,存在不被初始化的风险,解决思路有两个:一是明确限定变量的作用域;而是将初始化提前,避免不被初始化的发生。

以上就是c++ error:crosses initialization of 问题解决分析的详细内容,更多关于c++ error crosses initialization的资料请关注脚本之家其它相关文章!

相关文章

  • C++实现产生随机数和相应的猜拳小游戏实例代码

    C++实现产生随机数和相应的猜拳小游戏实例代码

    C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand()。下面这篇文章主要给大家介绍了关于C++实现产生随机数和相应的猜拳小游戏的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • 详解C++中多态的底层原理

    详解C++中多态的底层原理

    要了解C++多态的底层原理需要我们对C指针有着深入的了解,这个在打印虚表的时候就可以见功底,所以快来跟随小编一起学习一下吧
    2022-04-04
  • Qt中Tab与Tree组件实现分页菜单

    Qt中Tab与Tree组件实现分页菜单

    本文主要介绍tabWidget选择夹组件与TreeWidget树形选择组件的常用方法及灵活运用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • OpenCV中Grabcut算法的具体使用

    OpenCV中Grabcut算法的具体使用

    本文主要介绍了OpenCV中Grabcut算法的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C/C++实现线性顺序表的示例代码

    C/C++实现线性顺序表的示例代码

    使用顺序存储结构的线性存储结构的表为线性顺序表。本文将分别利用C语言和C++实现线性顺序表,文中示例代码讲解详细,需要的可以参考一下
    2022-05-05
  • C++操作SQLite简明教程

    C++操作SQLite简明教程

    这篇文章主要介绍了C++操作SQLite简明教程,包含创建表、插入数据、查询数据等常用操作,需要的朋友可以参考下
    2014-06-06
  • C语言实现数字炸弹小游戏

    C语言实现数字炸弹小游戏

    这篇文章主要为大家详细介绍了C语言实现数字炸弹小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • VS2022连接sqlserver数据库教程

    VS2022连接sqlserver数据库教程

    本文主要介绍了VS2022连接sqlserver数据库教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • VS2019配置BOOST的方法(v1.70.0库)

    VS2019配置BOOST的方法(v1.70.0库)

    这篇文章主要介绍了VS2019配置BOOST的方法(v1.70.0库),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • C语言修炼之路函数篇真题训练上

    C语言修炼之路函数篇真题训练上

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数
    2022-03-03

最新评论