Visual C ++'强制包含'选项

时间:2008-11-26 13:40:14

标签: c++ visual-c++

我刚刚遇到一个Visual C ++选项,允许您强制包含文件 - 这是在我查看每个.cpp文件中缺少#include "StdAfx.h"的代码时发生的,但实际上是通过这个选项这样做的。

该选项可在高级C / C ++配置属性页面上找到,并等同于 / FI 编译器选项。

这个选项可能真的很有用,但在我赶紧开始使用它之前,我想我会问是否有任何陷阱?

6 个答案:

答案 0 :(得分:16)

如果您使用的是预编译标头,我会说与上面的litb相反。如果您使用“stdafx.h”作为预编译头,并且具有以下代码:

#include "afile.h"
#include "stdafx.h"
那么你将花费一个年龄试图弄清楚为什么“afile.h”不被包括在内。使用预编译头时,所有include和#defines都会被忽略,直到“stdafx.h”。因此,如果您强制包含“stdafx.h”,那么上述内容将永远不会发生,您将获得一个有效使用预编译选项的项目。

对于litb关于查找宏的评论,好的IDE通常可以选择跳转到符号的定义,无论是#define,函数,类等等。

答案 1 :(得分:12)

我不鼓励来自/ FI(MSDN说它叫做/ FI。不确定我是否看过正确的页面),仅仅是因为人们或你自己阅读文件时没有注意到标题被神奇地包括在内无论如何。

您可以确定这会为想要找出特定宏来自哪里的人带来大量调试时间,即使文件顶部没有#include行。

答案 2 :(得分:3)

强制包含对自动生成的源文件也很有帮助。我们的系统使用生成许多源文件的工具,但它们不包括我们预编译的头文件。通过“强制包含”,这些文件的编译现在更快。

可选地,可以编写脚本以在生成之后和编译之前在这些文件中插入#include行。但为什么要去那个麻烦?

答案 3 :(得分:2)

我支持litb:不要强迫包括。使代码显式化可​​以更容易地了解新用户的情况。如果您需要将代码移植到新平台,它还可以更容易地了解发生了什么。

请注意,如果代码使用模板,则Visual Studio通常无法正确跟踪定义。也许2010年会更好,但即便是VS 2008在这方面也存在问题。

答案 4 :(得分:1)

保存此功能,以便在出现奇怪的内容时 - 例如,如果要在生成的源文件中包含标头。即便如此,也有更好的方法。

答案 5 :(得分:1)

我不会经常使用它,但它有它的用途。我已经用它来添加一个标题来抑制所有cpp文件的一些警告,这样我就可以打开项目的/ W4或/ Wall,而不必编辑所有的cpp文件,首先包含警告抑制标题。一旦eveything正在工作,我就会返回并编辑所有cpp文件,但是对于概念验证/ FI很有用。

同样,您可以使用它在一些构建配置中将预编译的头强制转换为cpp文件,但不是全部(如果您希望有一个构建配置,DOESNT使用预编译头并确保每个cpp仅包含它需要)。但是,使用#pragma hdrstop,恕我直言,这是实现这一目标的更好方法。

我已经在我的博客上谈到了所有这些:http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html更详细一点。