加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 具有相同名称的静态变量的开关案例的单独范围

发布时间:2020-12-16 09:50:45 所属栏目:百科 来源:网络整理
导读:更新:我现在重新测试了简化的测试用例和恢复共享名称的完整代码,并且它可以正常工作.我的代码中的其他地方可能还有一些其他错误现在已修复.很抱歉浪费你的时间和精力;将来不会在没有工作测试用例的情况下发布. Mea culpa. 我有一个C函数,我反复调用它.它包
更新:我现在重新测试了简化的测试用例和恢复共享名称的完整代码,并且它可以正常工作.我的代码中的其他地方可能还有一些其他错误现在已修复.很抱歉浪费你的时间和精力;将来不会在没有工作测试用例的情况下发布. Mea culpa.

我有一个C函数,我反复调用它.它包含以下代码段

switch(c)
     {
     case 1:
        {
          static int i = 0;
          if ( ... )  { i = 0; }
          .... 
          break;
        }
     case 2:
        {
          static int i = 0;
          if ( ... )  { i = 0; }
          .... 
          break;
        }
     case 3:
        {
          static int i = 0;
          if ( ... )  { i = 0; }
          .... 
          break;
        }
     }

这个想法是它必须记住每个案例的状态,有时它必须重置它.

它没有正常工作.当我进行调试时(MSVC 2010 Express Edition),我注意到每个人都不是独立行为,他们的价值观看起来似乎在变化;此外,当重置条件被命中时,相应的if被输入OK但是i = 0;声明只是…跳过!!!并且“locals”窗口显示i具有其先前的值,未更改(而当前语句是下一个,仍在if中). if中的其他语句正确执行.

当我用一个唯一的名称(i1,i2,i3)重命名每个i时,问题就消失了.

这是一些错误,还是我应该知道的一些语言功能?我认为每个块{…}定义了独立的范围.这里发生了什么?它会在C中工作吗?

编辑:抱歉没有构建测试用例.将这样做,并在稍后报告.

解决方法

这听起来像是代码或解释中的错误.我可以想象你的调试器中的“监视窗口”功能会出错,因为块没有名称,因此很难在文本中识别.

具有静态存储持续时间的局部变量受块范围约束.

这里证明他们没有功能范围:

[C++11: 3.3.5/1]: Labels (6.1) have function scope and may be used anywhere in the function in which they are declared. Only labels have function scope.

这是一个实际的演示:

#include <iostream>

void f(const int i)
{
    switch (i) {
        case 3: {
            static int x = 0;
            std::cout << x;
            x = 3;
            std::cout << x << ' ';
            break;
        }

        case 4: {
            static int x = 0;
            std::cout << x;
            x = 4;
            std::cout << x << ' ';
            break;
        }
    }
}

int main()
{
    f(3);
    f(4);
}

// Output: 03 04

这表明当输入第二种情况时,您正在使用不同的本地静态变量x.否则你会看到03 34.

Live demo using GCC 4.8;我在Visual Studio 2012中获得了相同的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读