不要在namespace定义内包含文件
2011-06-17 23:14
260 查看
今天在写C++程序时,有一个有关命名空间中包含文件引发的bug,花费了好大一会儿才找到原因,特此记录。
简化后的程序片段如下,其中a.h和a.inl分别是头文件和内联函数定义文件。
编译后,函数foo()将出现两个不同的声明:
1)myns:foo();
2)myns::myns::foo();
且第1个函数没有定义,将导致链接失败。
一种解决办法是,去掉a.inl文件中定义的命名空间前缀,但这么做会导致定义不明确,使用了隐含的命名空间。
所以最好的办法是,在命名空间的声明范围内,不要包含其他文件。如果需要包含文件,应该放到命名空间外面。
简化后的程序片段如下,其中a.h和a.inl分别是头文件和内联函数定义文件。
//a.h namespace myns { int foo(); include "a.inl" } //a.inl inline int myns::foo() { return bar(); }
编译后,函数foo()将出现两个不同的声明:
1)myns:foo();
2)myns::myns::foo();
且第1个函数没有定义,将导致链接失败。
一种解决办法是,去掉a.inl文件中定义的命名空间前缀,但这么做会导致定义不明确,使用了隐含的命名空间。
所以最好的办法是,在命名空间的声明范围内,不要包含其他文件。如果需要包含文件,应该放到命名空间外面。
相关文章推荐
- 最好不要在头文件里面包含定义变量
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 【原创】利用PHP5的类定义自动载入代替繁琐低效的的外部文件包含方式
- 不要在头文件中使用 using namespace std;
- C++头文件的重定义问题以及头文件互相包含问题
- C++ 头文件(十五)--定义成员属性、引用、避免多次包含
- 没有躲过的坑--头文件相互包含(Compiler error C2653: not a class or namespace name)
- 如何引用一个已经定义过的全局变量 与 全局变量可不可以定义在可被多个.C文件包含的头文件中
- 关于头文件中的重复包含和重复定义
- IAR包含文件的路径定义
- 如何引用一个已经定义过的全局变量 与 全局变量可不可以定义在可被多个.C文件包含的头文件中
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 防止变量重复定义、头文件重复包含、嵌套包含
- 变量一般不要定义在.h文件中
- 没有躲过的坑--头文件相互包含(Compiler error C2653: not a class or namespace name)
- 请问哪个头文件包含了CString类的定义说明?
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- hibernate 中没事不要用映射文件中用<list>定义合集,而要是用Set
- 【自我修养】不要嘻嘻哈哈的在头文件中定义变量
- xml文件中的内容包含了XML文档中预定义好的实体解决办法