2009-01-04 21 views
20

我对头文件的用法有以下怀疑。使用C++头文件的最佳做法

1 - 包括警卫意见后,将

/* Copyright Note and licence information (multiple lines) */ 
#ifndef FOO_H 
#define FOO_H 
// Header file contents 
#endif 

香草萨特说,在他的“C++编码标准”预定像上面的代码是有问题的。他说“#ifndef”语句应该出现在头文件的第一行。我没有觉得这是令人信服的。这是否跟在头文件中的你们/ gals?

2 - 在头文件

#ifndef FOO_H 
#define FOO_H 
namespace FooNameSpace{ 
    // Header file contents 
} 
#endif 

使用命名空间采用了正确的做法上面的代码?我的意思是,你是否在头文件中使用名称空间?我知道为什么在头文件中导入一个名字空间是毫无意义的,但是像上面这样的声明呢?

如果上面的一个是正确的方法,你如何做一个类在另一个命名空间的“前向声明”?是像

#ifndef FOO_H 
#define FOO_H 
namespace AnotherNameSpace{ 
    class AnotherFoo; // forward declaration 
} 

namespace FooNameSpace{ 
    // Use AnotherFoo here 
} 
#endif 

的“向前声明”是为了避免“循环依赖”的唯一方法,正确吗?

回答

19
  1. 包括卫兵和评论的顺序纯粹是一种风格问题 - 它不会对编译速度产生任何可衡量的影响。

  2. 命名空间绝对应该在头文件中用于声明函数,类,全局变量,等等。你应该做的是使用using报表头文件 - 这是不可能在包括源文件UNUSE东西它,你不应该强迫包括增加额外的东西到全球范围。如果您需要使用标题中其他名称空间的内容,请完全限定每个名称。有时候这可能是一种痛苦,但它确实是正确的做法。

例子:

// WRONG! 
using namespace std; 
class MyClass 
{ 
    string stringVar; 
}; 

// RIGHT 
class MyClass 
{ 
    std::string stringVar; 
}; 

至于在其他命名空间类向前声明,你就完全正确。请记住,当您在标题中引用AnotherFoo时,请始终符合AnotherNameSpace::AnotherFoo的条件。事实上,前向声明是打破循环依赖的唯一途径。

3

关于#1,我没有意识到有任何具体的论点赞成或反对。许多公司都有一项政策,即版权声明必须是文件中的第一项内容或任何有意义的代码(也许假设您会在吸收任何代码之前阅读版权)。为此,#IFNDEF已经是代码。从可用性的角度来看,将版权置于首位是有道理的,因为眼睛忽略了它们。然而,在我看来,描述模块的任​​何东西都应该在#ifndef之后。

2

1)由于评论实际上没有做任何事情,所以我怀疑这很重要。从技术上讲,#include可以复制和粘贴,所以将标题放在标头警卫之外意味着更多的预处理工作。我不知道大多数编译器是否足够聪明来优化它(即,如果它们在预处理器步骤之前删除了注释),但是直到达到数以万计的头文件时,您可能不会注意到它。

2)这是正确的。如果你想把一个类放入一个名称空间中,并且该类将在头文件中声明,那么它应该在名称空间中声明,因此应该放在头文件中。是的,这就是你如何前瞻性地宣布。是的,它是避免循环依赖的主要工具(您也可以更改您的设计,但原则上循环性没有问题,前提是两个类只能通过引用或指针相互引用,而不是调用任何方法) 。

7
  1. 我听说有评论 之前,包括后卫可能会导致一些 编译器会错过的 优化。如果守卫是 第一件事,编译器可能会认出这个习惯用语,甚至不会为 打开后续包含的标题。在我自己的 代码中,评论通常在 之前包含警卫。我没有 困扰测试,看看这是否有 有任何影响或没有。我可能永远不会(但如果别人这样做,我会对结果感兴趣)。

  2. 当然标题都应该纳入 命名空间 - 否则,没有什么 有用的可能永远是一个 命名空间中。但是,正如你提到的 ,标题不应该 “导入”(为了更好的词) 名称空间到编译单元 'using'指令。

2
  1. 我不认为将有评论指出作为亚当的回答这个帖子任何性能影响。

  2. 我已经在头文件中使用了自己的名称空间,如果您定义了自己的字符串类,那么它会与std名称空间字符串类发生冲突。

使用“使用”的关键字完全是没有错的(因为它给你很多的便利和减少很多您的所有变量前键入)

+5

在源文件中,使用“使用”不根本不对,但在头文件中,这是非常错误的。 – 2009-01-04 06:21:48