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中工作吗? 编辑:抱歉没有构建测试用例.将这样做,并在稍后报告. 解决方法
这听起来像是代码或解释中的错误.我可以想象你的调试器中的“监视窗口”功能会出错,因为块没有名称,因此很难在文本中识别.
具有静态存储持续时间的局部变量受块范围约束. 这里证明他们没有功能范围:
这是一个实际的演示: #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中获得了相同的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |