退出预处理程序块时,整数值会更改

时间:2009-01-06 00:04:05

标签: c# c-preprocessor variable-assignment

我有一大堆代码,看起来变量在预处理器代码块的末尾发生了变化。

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。

预处理器块中的分配是否在该块之外未定义?这似乎是错的,但似乎是这里发生的事情。

5 个答案:

答案 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
在0000009b,该值为0x4e20
在0000009e,该值为0x4e21
在0000009f,值为0x4e01

我承认自从我编写任何汇编代码以来已经过了很长时间,但我非常有信心nop不应该写入内存。 :)

显然有些代码正在执行,调试器没有显示。有没有人知道我是如何使用导致这种情况的预处理器,或者这只是一个错误?

答案 4 :(得分:0)

听起来像Visual Studio感到困惑。

按顺序尝试这些步骤
  1. 使用清洁命令
  2. 重新启动Visual Studio
  3. 删除甚至远程看起来像您的程序的每个DLL和EXE
  4. 仔细检查每个BIN和OBJ文件夹,看看是否遗漏了任何内容。
  5. 在您的整个硬盘驱动器中搜索任何甚至远程看起来像您的程序的DLL和EXE,并将其删除
  6. 我曾经在我工作的一家IT公司每周看一次。它通常发生在您拥有同一个项目的多个副本时,但即使没有它,我也已经看过它了。