【发布时间】:2014-03-29 06:43:45
【问题描述】:
更新:我现在重新测试了简化的测试用例和恢复共享名称的完整代码,并且它可以正常工作。我的代码中的其他地方可能还有其他错误,现在已修复。很抱歉浪费您的时间和精力;将来不会在没有工作测试用例的情况下发布。 过失。
我有一个反复调用的 C++ 函数。它里面有下面的sn-p
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)时,我注意到每个i 的行为并不是独立的,它们的值似乎在自行变化;此外,当重置条件被触发时,相应的if 输入正常,但i = 0; 语句只是...... 跳过! “locals”窗口显示i,其先前的值保持不变(而当前语句是下一个语句,仍在if 内)。 if 中的其他语句正在正常执行。
当我用唯一的名称(i1、i2、i3)重命名每个 i 时,问题就消失了。
这是一些错误,还是我应该知道的一些语言特性?我认为每个块{ ... } 都定义了独立的范围。这里发生了什么?它可以在 C 中工作吗?
编辑:很抱歉没有构建测试用例。会这样做,稍后再报告。
【问题讨论】:
-
您能否提供一个测试用例来准确展示您所看到的内容? (即一个小程序,预期的输出和(意外的)实际输出。)如果它确实将所有这些变量视为相同,那么这是一个错误;但不可能从示例代码中看出你的真实代码可能是什么样子。
-
我不能,不能及时,抱歉。但是任何简单的事情都可以。比如说,当(每个)
i命中 4 时,将其重置为 0;当它是==c时,打印出来。然后使用c= 1,2,1,3,1,2,1,3,1,2,1,3,1,2,1... 调用函数,应该会出现错误。跨度> -
很遗憾,如果您不能提供代码来演示问题,我们无法猜测问题可能是什么。它们都应该是自变量;如果它们表现得好像不是,那么编译器、您的代码或您对其行为的解释中存在错误。我怀疑不是编译器。
-
@ДарВетер 我的回答显示了一个“简单的事情”,当然不会重现您所描述的问题。您应该在自己的调试过程中构建测试用例,早在此处发布之前!当你做最终在这里发布时,你应该发布测试用例。 (另外,哪个版本的 MSVC++?有很多。)谢谢!
-
@MikeSeymour 我会的,只是需要一些时间。
标签: c++ c static scope switch-statement