Visual Studio在C / C ++代码中使用错误的#ifdef'd段落

时间:2010-09-18 01:06:11

标签: visual-studio visual-studio-2008 visual-c++

我正在开发一个在Visual Studio 2008下开发和维护的大型继承C ++(实际上是C)项目。从技术上讲,在Visual Studio术语中,它是一个由八个“项目”组成的“解决方案”,其中似乎很容易。

我相信你们大多数人都知道,Visual Studio会将它认为是#ifdef的代码视为灰色。但我发现,对于不同的项目,它似乎没有正确地做到这一点。为了简单起见,让我们称它们为Proj1,Proj2,...... Proj8。当我正在使用Proj5的Win32 Debug配置时,我希望在Proj5的C / C ++预处理器属性配置中定义的宏将确定什么是灰色的(或者至少可以有一些简单的方法来实现它所以)。相反,我似乎看到了基于Proj1属性的视图。也就是说,如果Proj1定义了一些消除部分代码的预处理器宏,那么即使我正在使用Proj5,我也会看到该部分变灰。 Proj5的宏对我所看到的一点都没有影响。

是的,我做了一个完整的清理和构建(几个,实际上,甚至将所有内容保存到SVN并在一个新的顶级文件夹中启动),所以我很确定这不是因为一些残留文件由旧版本制作。而且我很确定Visual Sourcesafe在其他方面正确“理解”了上下文,因为(1)Build菜单包含与Proj5相关的选项,而不是Proj1; (b)项目菜单底部是“Proj5属性......”而不是“Proj1属性......”; (c)毫无疑问,#ifdef正在构建的程序中运行:存在主要的功能差异,并且它们正如我所期望的那样。


ADDED 2010年9月27日我仍然没有答案,所以让我以不同的方式尝试:假设我已经运行成功的构建(我有),除了之外的任何当前所选项目的预处理器属性和配置(以及下面提到的那些单个文件,但在这种情况下是没有意义的)应该影响哪些代码变灰?

3 个答案:

答案 0 :(得分:1)

请查看是否可以为各个文件设置这些预处理程序指令。您可以通过右键单击源文件并从上下文菜单中选择“属性”来完成此操作。认为可以为单个文件设置指令,而不仅仅是为项目设置,这有点违反直觉。

如果这没有帮助,最好的办法是使用文本编辑器在每个项目文件中查找问题预处理器定义,以便更好地了解可能发生的情况。

答案 1 :(得分:1)

VS2010应该有助于此。在VS2008中,无编译浏览缓存是在预处理之后完成的,因此它只能容纳一组宏定义。

我不相信“Build Clean”或“Rebuild”会删除.ncb文件,因为它们根本不属于构建过程。我知道手动删除这些文件会修复各种奇怪的行为,但我担心在你的情况下它不会是一个持久的解决方案(.ncb文件仍将基于单个配置填充。)

答案 2 :(得分:0)

使项目成为启动项目并删除并重新添加有问题的预处理器定义

详细说明: 我找到了一个可以在发生这种情况时修复我的MFC项目的过程(至少是暂时的)。首先,我将我正在进行的项目设置为启动项目。通过右键单击解决方案资源管理器中的项目并选择“设置为启动项目”来执行此操作。然后我进入项目的预处理器定义并删除未触发的那个,然后单击OK。几秒钟后,您会在右下角看到一个小进度条。完成后,返回到项目的预处理器定义并再次将其重新添加,然后单击“确定”。小进度条再次完成后,您应该会再次看到正确的代码。