c++ - '#include' 和 'using' 语句是否应该在头文件和实现文件 (C++) 中重复?

标签 c++ include header-files using-statement

我是 C++ 的新手,但我的理解是 #include 语句基本上只是将 #included 文件的内容转储到该语句的位置。这意味着如果我的头文件中有许多'#include'和'using'语句,我的实现文件可以只#include头文件,如果我不重复其他语句,编译器就不会介意.

但是人呢?

我主要担心的是,如果我不重复“#include”、“using”和“typedef”(现在我想到了)语句,它会从它所在的文件中获取该信息使用,这可能会导致混淆。

目前我只是在处理小型项目,它不会真正造成任何问题,但我可以想象,在有更多人参与的大型项目中,它可能会成为一个重大问题。

例子如下:

更新:我的“Unit”函数原型(prototype)在它们的返回类型和参数中有字符串、ostream 和 StringSet - 我没有在我的头文件中包含任何仅在实现文件中使用的内容。

//Unit.h

#include <string>
#include <ostream>
#include "StringSet.h"

using std::string;
using std::ostream;

class Unit {

public:
    //public members with string, ostream and StringSet
    //in their return values/parameter lists
private:
    //private members
    //unrelated side-question: should private members
    //even be included in the header file?
} ;


//Unit.cpp

#include "Unit.h"

//The following are all redundant from a compiler perspective:
#include <string>
#include <ostream>
#include "StringSet.h"

using std::string;
using std::ostream;

//implementation goes here

最佳答案

using-directive(using namespace std;)不应驻留在 header 中,除非它包含在函数中。这是不好的做法。您的 header 的每个用户都不太可能希望对给定 namespace 中的所有内容进行非限定查找;包含不相关的 header 可能会导致意外的歧义和编译失败。出于同样的原因,我个人避免在函数内部使用 using-directive,但这通常被认为危害较小。

应使用类型别名(通过typedef std::string string;using string = std::string;)小心。类型定义是有意义的,所以你不应该重新声明它。例如,这是一个错误:

typedef int   myint;
typedef float myint;

因为类型冲突。

using-declaration(using std::string;using std::memcpy;)使符号可访问 unqualified name lookup。它在获得 argument-dependent lookup 正确时非常有用,这通常无关紧要,除非你正在编写一个库。根据您引入的是类型还是函数,建议会有所不同。将 using-declaration类型别名 相同的方式想一想:在同一个名称下有多个定义是没有意义的。对于函数,您真正要做的就是扩展重载解析以包含更多内容(尽管通常没有必要这样做)。

// Finding multiple operator<< functions makes sense
using std::operator<<;
using mylib::operator<<;

// Finding multiple string classes does not make sense
using std::string;
using mylib::string;

对于重复#include,您应该首先考虑是否确实需要在 header 中包含该文件。也许 forward declaration 可以满足您的需求。

关于c++ - '#include' 和 'using' 语句是否应该在头文件和实现文件 (C++) 中重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2717700/

相关文章:

c - 小端宏

c++ - 包含自身实例化的模板,C++ 中的递归

c++ - 即使不知道元素的确切数量,也要调用 QVector::reserve 吗?

javascript - include() 函数在比较数组中的值时随机工作

c# - ASP.NET MVC Html Helper 扩展和呈现它们所需的 "include"s

c++ - 设置内联函数的正确方法

c++ - 具有前向声明类的 QSharedDataPointer

c++ - 有效地从数据文件中加载数字

php - PHP 在 Mac 上的正确路径是什么?

c++ - 我什么时候应该 `#include <ios>` , `#include <iomanip>` 等?