C++ 命名空间std
std::cout<<"hello world"<<std::endl;
前缀std:: 指出名字cout 和 endl 是定义在名为std 的命名空间(namespace) 中的。
命名空间可以避免命名冲突。
标准库定义的所有名字都在命名空间std 中。
1. 由命名空间引发的问题
看一段程序,程序没有实际意义,旨在说明问题:
//paraTest.h
#ifndef PARATEST_H
#define PARATEST_H
#include <vector>
void sFunction(std::vector<int> &vi);
#endif
//paraTest.cpp
#include "paraTest.h"
#include <algorithm>
void sFunction(std::vector<int> &vi){
sort(vi.begin(),vi.end());
}
//main.cpp
#include "paraTest.h"
#include <iostream>
using namespace std;
int main(){
vector<int> vi;
vi.push_back(13);
vi.push_back(14);
vi.push_back(66);
vi.push_back(25);
vi.push_back(2);
sFunction(vi);
for(int i=0;i<vi.size();++i)
cout<<vi[i]<<' ';
cout<<endl;
return 0;
}
最后一个CMakeLists.txt,需要回顾cmake看这里。#CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(pro)
add_executable(test2 main.cpp paraTest.cpp)
采用out-of-source 方式构建:
#在顶层目录,CMakeLists所在目录
mkdir build
cd build
cmake ..
make
./test2
然后,可以看到vector 中的元素从小到大输出了。
注意到:在paraTest.h 和 paraTest.cpp 文件中,vector 前面都有 命名空间std:: 前缀。
如果不加,会报错:
error: ‘vector’ was not declared in this scope
/home/mitre/cppTest/vector/paraTest.h:7:16: note: suggested alternative:
In file included from /usr/include/c++/5/vector:64:0,
from /home/mitre/cppTest/vector/paraTest.h:3,
from /home/mitre/cppTest/vector/main.cpp:1:
/usr/include/c++/5/bits/stl_vector.h:214:11: note: ‘std::vector’
好习惯:
- 不要在头文件里 写using namespace XXX; 这样的语句。因为一旦头文件被别的源文件包含,XXX命名空间直接就成为本源文件的命名空间了,会容易引起命名冲突。
-
还可以在源文件中这样写:using std::vector; using std::map; using std::string 等等这样写法。
-
还可以在源文件的局部作用域 中写using,比如函数中
2. 总结
- 不要在头文件中使用命名空间
- 标准库定义的所有名字都在命名空间std 中
今天,我找到了那个和C++11 冲突的原因了。
第8行,这个命名空间boost,是skill.h 文件中 类型vector 和 shared_ptr 的命名空间。
boost::shared_ptr 和C++11 特性中std::shared_ptr 冲突。
解决这个冲突就好了。
上一篇: 汽车厂商能抢无人驾驶专利吗
下一篇: Python简介4