我是 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/