我有一大堆代码,看起来变量在预处理器代码块的末尾发生了变化。
int initialKeyCount;
#if(DEBUG)
// int initialKeyCount = _root.CountAllKeys();
initialKeyCount = 20000;
#endif
currNode = currNode.EnsureDegreeKeysPresent(parent); //initialKeyCount = 19969 here
#if(DEBUG)
int currentKeyCount = _root.CountAllKeys();
Debug.Assert(initialKeyCount == currentKeyCount,
string.Format("EnsureDegreeNodesPresent changed the node count from {0} to {1}.", initialKeyCount, currentKeyCount));
#endif
在假设分配20000之后在调试器initialKeyCount = 19969中执行此操作时。我已经玩了一下这个,发现在第一个预处理器块内对initialKeyCount的赋值是正确的,但是一旦代码离开第一个预处理器阻止该值神奇地改为19969。
无论变量是在第一个预处理器块内部还是外部声明,此行为都是相同的。该值在第二个预处理器块内保持为19969。
预处理器块中的分配是否在该块之外未定义?这似乎是错的,但似乎是这里发生的事情。
答案 0 :(得分:1)
这种行为听起来非常像调试器运行的代码与您正在编辑的源代码不匹配。您是否完全确定您的源更改是否一直在运行您正在运行的代码?
预处理程序块与语言语法无关。所以,你说预处理器块不影响变量定义的范围是正确的。
答案 1 :(得分:0)
我同意Greg Hewgill的观点 - 我以前见过这种事。
此外,找到调试器正在使用的程序集并使用Reflector打开它。反汇编可以让您更好地了解实际发生的情况。
答案 2 :(得分:0)
当面对这样的事情时,请在装配层面看一下。
虽然装配是你几乎从不编码的东西,但是现在只需一个 NEEDS 就可以了解它来追踪这样的谜团。
答案 3 :(得分:0)
事情变得陌生和陌生。我采用了上述建议并使用Reflector和调试器提供的反汇编检查了代码,两者看起来都像您期望的那样。我稍微修改了代码,以清楚地显示变量中的“神奇”变化。
新代码
int initialKeyCount;
#if(DEBUG)
// int initialKeyCount = _root.CountAllKeys();
initialKeyCount = 20000;
initialKeyCount++;
initialKeyCount = initialKeyCount;
#endif
currNode = currNode.EnsureDegreeKeysPresent(parent);
#if(DEBUG)
int currentKeyCount = _root.CountAllKeys();
Debug.Assert(initialKeyCount == currentKeyCount,
string.Format("EnsureDegreeNodesPresent changed the node count from {0} to {1}.", initialKeyCount, currentKeyCount));
#endif
以上的反汇编是
int initialKeyCount;
#if(DEBUG)
// int initialKeyCount = _root.CountAllKeys();
initialKeyCount = 20000;
00000094 mov dword ptr [ebp-50h],4E20h
initialKeyCount++;
0000009b inc dword ptr [ebp-50h]
initialKeyCount = initialKeyCount;
0000009e nop
#endif
currNode = currNode.EnsureDegreeKeysPresent(parent);
0000009f mov edx,dword ptr [ebp-48h]
...
使用内存窗口我看了ebp-0x50的值 当IP
时 <00>在00000094处,该值为0x0我承认自从我编写任何汇编代码以来已经过了很长时间,但我非常有信心nop不应该写入内存。 :)
显然有些代码正在执行,调试器没有显示。有没有人知道我是如何使用导致这种情况的预处理器,或者这只是一个错误?
答案 4 :(得分:0)
听起来像Visual Studio感到困惑。
按顺序尝试这些步骤我曾经在我工作的一家IT公司每周看一次。它通常发生在您拥有同一个项目的多个副本时,但即使没有它,我也已经看过它了。