zoukankan      html  css  js  c++  java
  • switch case 变量初始化问题

    今天再写alsa的时候遇到一个稀奇古怪的问题,网上看了下资料,摘出来入下

    代码:

     1 int main()
     2 {
     3    int a =0;
     4    switch(a)
     5    {
     6      case 0: 
     7           int b = 0;
     8           break;
     9      case 1: 
    10           break;
    11      default:
    12           break;
    13    }
    14    return 0;
    15  }

    编译器提示错误:

    testswitch.cpp: In function ‘int main()’:
    testswitch.cpp:9: error: jump to case label
    testswitch.cpp:8: error: crosses initialization of ‘int b’
    testswitch.cpp:10: error: jump to case label
    testswitch.cpp:8: error: crosses initialization of ‘int b’

    出现这样的提示,你很有可能在某个case标记中定义了局部变量,而后面还有其他的case标记或者default语句。。比如说这里的整形变量b。

    看看编译器提示的信息 cross initialization of int b, 什么意思呢, 就是说跳过了变量的初始化,仔细想想,确实是这样,我们在case 0 中定义了变量b,在这个程序中,直到遇到switch的“}”右花括号,b的作用域才终结,也就是说 在case 1 和 default 分支中 变量b依然是可以访问的。考虑这样一种情况,如果switch匹配了case 1,这样case 0的代码被跳过了,那么b就没有定义,如果此时在case 1的代码中访问了b,程序会崩溃的。如果谁也不匹配,执行default也会有同样的危险。

    知道了错误的原因,解决起来就很简单了

    1,将case 0 标记 的代码用 {}括起来,这样b的作用域在这个花括号内。在其他的case 标记中不能访问。

    2. 将 变量b放在 switch外面 定义。

  • 相关阅读:
    ARM的反汇编工具
    Windows上使用Objectivec和Cocoa
    linux 统计代码行数
    oracle数据库基本操作
    thinkphp 带检索参数分页
    Object 转为List
    MvvM datagrid多行选中绑定
    mvvm Dev12.1 GridControl 导出
    ASP.NET MVC入门,好文共享
    [职场、征人、面试](呛)你到底要不要换工作? Part (II) 诚实,最难堪的状态,却最有价值的对策
  • 原文地址:https://www.cnblogs.com/jlmgary/p/6281597.html
Copyright © 2011-2022 走看看