#include重复发现的任何工具?

时间:2012-03-17 07:41:10

标签: c++ include duplicates

这听起来很奇怪,但也许存在一个......我用Google搜索,但没有发现任何东西 简单的例子:
我有一个文件class1.h:

#include "a.h"
#include "b.h"

另一个文件class2.h:

#include "a.h"
#include "c.h"

和main.cpp:

#include "class2.h" //as we see here, we getting "a.h" double included by class1.h and class2.h

我想在我的项目中摆脱这种欺骗
当然,在例子中并没有那么难,但我有大量的文件,它们在很多方面相互包含,很难自己追踪所有的欺骗。

在我自己编写该工具之前,有什么建议吗? :)

4 个答案:

答案 0 :(得分:6)

正如我所看到的,如果文件中的代码依赖于要声明的其他内容,它应该包含包含这些声明的文件。否则,东西变得脆弱,包括必须一直按照一定的顺序完成,这一切都变得丑陋。所以对我来说,“重复包含”是一件好事;每一段代码都可以轻松处理自己的依赖关系。

关于如何防止重复包括......有一个被称为“包含警卫”的成语。他们看起来像这样......

(file1.h)

#ifndef FILE1_H
#define FILE1_H

(the meat of file1.h goes in here)

#endif

第一次包含此文件时,FILE1_H尚未定义(或者不应该定义,假设您为文件选择了比此更好的名称),因此代码将被包含(和{{ 1}}随后得到定义)。但是,下次包含它时,FILE1_H现在已定义,因此代码将被跳过。

(顺便说一下,任何宏名都适用于此,只要它对每个文件都是唯一的。但是这个特殊约束是宏的名称几乎总是基于文件名的最大原因。)

在大多数编译器上,FILE1_H也可以。但它不是标准的;如果你关心能够使用你想要的任何编译器,那就不要使用它(或者除了包含保护之外还使用它。)

答案 1 :(得分:2)

您应该使用 Include Guards ,这样您就不会在同一translation unit中包含相同的标题多次。

一旦你有包含警卫你就不必费心多次包含头文件了。一个好的做法是每个源文件或头文件应该包含独立编译所需的头文件,即:不应该依赖包含其他包含的文件。

答案 2 :(得分:1)

另外@Als说,开始使用前向声明。

答案 3 :(得分:0)

我已经将#pragma once广泛用于我的c ++项目,但正如我所听到的那样,它可能对所有编译器都不起作用,但是如果你使用的是Microsoft Visual Studio,那么这就行了(我在VC ++中使用过它) 6.0,2005和2010)