不要在头文件中使用 using
2012-02-22 22:30
375 查看
命名空间是c++提供的一种机制,可以有效地避免函数名污染。然后在应用时要十分注意:任何情况下都不应在头文件中使用“using namespace xxx”这样的语句。
这是为什么呢?来看下面的例子,我们在命名空间ABC和XYZ中分别定义了一个sort函数,如下所示:
如果我们在一个头文件 data.h 中用到了命名空间 ABC 中的 sort 函数:
麻烦马上就要出现了!如果我们在另一个文件中同事用到了 data.h 中的 DoSomething() 和 xyz.h 中的 sort(),编译器就会报错:“error C2688: 'XYZ::‘sort’,对重载函数的调用不明确”。
这就是传说中的命名空间污染。
之所以会出现这个问题,是因为在包含头文件 data.h 的源文件中相当于也用了"unsing namespace ABC",而这样的命名空间引入是在不知不觉中完成的。
因此,最好不要在头文件里面使用“using names XXX”,而应该在声明时直接用全称。
这是为什么呢?来看下面的例子,我们在命名空间ABC和XYZ中分别定义了一个sort函数,如下所示:
// 文件 abc.h namespace ABC { void sort() { ... } } // 文件 xyz.h namespace XYZ { void sort() { ... } }
如果我们在一个头文件 data.h 中用到了命名空间 ABC 中的 sort 函数:
// 文件 data.h #include "abc.h" using namespace ABC; void DoSomething() { // use sort() to do something }
麻烦马上就要出现了!如果我们在另一个文件中同事用到了 data.h 中的 DoSomething() 和 xyz.h 中的 sort(),编译器就会报错:“error C2688: 'XYZ::‘sort’,对重载函数的调用不明确”。
#include "data.h" #include "xyz.h" using namespace XYZ; int DataProcessing() { sort(); DoSomething(); }
这就是传说中的命名空间污染。
之所以会出现这个问题,是因为在包含头文件 data.h 的源文件中相当于也用了"unsing namespace ABC",而这样的命名空间引入是在不知不觉中完成的。
因此,最好不要在头文件里面使用“using names XXX”,而应该在声明时直接用全称。
相关文章推荐
- 不要在头文件中使用 using namespace std;
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- Web移动端使用localStorage缓存Js和css文件 | 强制不要缓存
- [导入]SVN使用技巧 - 不要把不必要的文件版本化
- spring的配置文件不要使用版本号
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- Java基础之写文件——使用Formatter对象加载缓冲区(UsingAFormatter)
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 安装 Mac OS X 时不要使用大小写敏感的日志文件系统
- Using GLib's GKeyFile Parser (使用Glib解析配置文件)
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- Using a MultipartResolver with Commons FileUpload[就是使用commons FileUpload上传文件]
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 在头文件里避免使用using namespace XXX;
- aspx文件,app_code内的类无法使用的排查 编译器错误消息 CS0246 找不到类型或命名空间名称“QPUtils”(是否缺少 using 指令或程序集引用)
- Using Settings in C# 在C#中使用APP.CONFIG配置文件
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 尽量不要使用using namespace std;VC++2005使用有感
- 在头文件里避免使用using namespace XXX
- 不要在使用了预编译头文件的项目的“头文件”中使用Lambda表达式