Dav*_*son 6 c++ using-statement include header-files
我对C++很新,但我的理解是#include语句基本上只是将#included文件的内容转储到该语句的位置.这意味着如果我的头文件中有一些'#include'和'using'语句,我的实现文件只能#include头文件,编译器不介意我不重复其他语句.
那人呢呢?
我主要担心的是,如果我不重复'#include','using',以及'typedef'(现在我想到它)语句,它会从使用它的文件中取出该信息,可能导致混乱.
我现在只是处理小型项目,它不会真正导致任何问题,但我可以想象,在有更多人工作的大型项目中,它可能成为一个重要问题.
一个例子如下:
更新:我的'Unit'函数原型在它们的返回类型和参数中有字符串,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
Run Code Online (Sandbox Code Playgroud)
甲使用指示符(using namespace std;除非它被包含在函数中)不应该驻留在报头中.这是不好的做法.标头的每个用户都不太可能希望对给定命名空间中的所有内容进行非限定查找; 包含不相关的标头可能会导致意外的歧义和编译失败.就个人而言,我在相同的推理中避免使用函数内部的使用指令,但这通常被认为危害较小.
甲类型别名(通过typedef std::string string;或using string = std::string;)应该小心使用.类型定义具有意义,因此您永远不应重新声明它.例如,这是一个错误:
typedef int myint;
typedef float myint;
Run Code Online (Sandbox Code Playgroud)
因为类型冲突.
一个using声明(using std::string;或using std::memcpy;)使得一个符号访问不合格的名称查找.当获取依赖于参数的查找正确时,它非常有用,除非您正在编写库,否则通常无关紧要.根据您是否引入类型或功能,建议会有所不同.考虑使用声明的类型与类型别名相同:使用相同名称的多个定义没有意义.对于函数,您所做的只是扩展重载决策以包含更多内容(尽管通常没有必要).
// 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;
Run Code Online (Sandbox Code Playgroud)
要重复#include,您应该考虑是否确实需要首先将文件包含在标题中.也许前瞻性声明符合您的需求.
using在头文件中使用语句(除非在函数作用域内)...using在头文件中添加会污染包括头文件在内的所有源的命名空间。您无需关心某些包含是否多余。头文件保护和预编译器优化可以为您处理。
您应该能够单独操作每个文件。
例如,假设您std::string在标头和源代码中使用了 ,但是,作为“优化”,您只在标头中包含了字符串...如果您稍后发现不再需要标头中的字符串,并且想要删除它(代码清理,以及所有......),您必须修改源以包含字符串。现在,让我们假设您有十个源,包括标题...
现在,当然,您可以对此规则有例外(例如,预编译的头文件,甚至头文件的唯一目的是礼貌地进行多个包含),但默认情况下,您应该拥有自给自足的头文件和源文件(即包含他们使用的任何内容的文件,不多不少)。
| 归档时间: |
|
| 查看次数: |
3116 次 |
| 最近记录: |