1. std和cout的引入
(1)std是C++标准库定义好的一个namespace
C++为了保证程序员定义的函数不与标准库中的函数不冲突,用了命名空间这种机制;C语言是不能保证C的标准库中的函数名与程序员自己定义的函数名不冲突,C语言中完全是靠程序员自己注意来避免与C标准库中的函数不冲突。
(2)cout是std这个namespace下的一个标准输出工具(实际是一个对象),类似于C中的printf。
例子
#include <iostream> //包含头文件iostream是因为命名空间std在里面声明了
using namespace std;
int main(void)
{
cout << "hello world." << endl; //cout和endl都定义在std中
return 0;
}
或者这可以这么写
#include <iostream> //包含头文件iostream是因为命名空间std在里面声明了
//using namespace std;
int main(void)
{
std::cout << "hello world." << std::endl; //cout和endl都定义在std中,这个endl就是换行
return 0;
}
2. 匿名命名空间的定义和使用
(1)定义
(2)匿名命名空间中引用自己命名空间中的方法
(3)匿名命名空间中引用自己命名空间中的方法
(4)其他命名空间中引用匿名命名空间中的方法
#include <iostream> //包含头文件iostream是因为命名空间std在里面声明了
using namespace std;
namespace //匿名命名空间,没有名字
{
void func2(void)
{
cout << "func2 from anonymous namespace" << endl;
}
}
namespace NS //有名命名空间,名字就是NS
{
void func1(void)
{
// cout << "func1 from namespace NS" << endl;
func2();
}
};
int main(void)
{
NS::func1();
// std::cout << "hello world." << std::endl; //cout和endl都定义在std中
return 0;
}
总结:匿名命名空间是跨文件使用的时候才能起作用
创建两个文件hello.cpp 及hello2.cpp
hello.cpp内容如下:
#include <iostream> //包含头文件iostream是因为命名空间std在里面声明了
using namespace std;
namespace //声明匿名命名空间
{
extern void func2(void); //加extern是在另外一个文件中定义
}
namespace NS //有名命名空间,名字就是NS
{
void func1(void)
{
// cout << "func1 from namespace NS" << endl;
func2();
}
};
int main(void)
{
NS::func1();
// std::cout << "hello world." << std::endl; //cout和endl都定义在std中
return 0;
}
hello2.cpp内容如下:
#include <iostream> //下面使用cout和endl,所以要加他们的声明
using namespace std; //std是C++标准库定义好的一个namespace,一次性声明指定命名空间std里面的所有变量函数等
namespace //匿名命名空间,没有名字
{
void func2(void)
{
cout << "func2 from anonymous namespace" << endl;
}
}
编译如下:g++ hello.cpp hello2.cpp
报链接错误
hello.cpp:7:14: warning: ‘void {anonymous}::func2()’ used but never defined
extern void func2(void); //¼ÓexternÊÇÔÚÁíÍâÒ»¸öÎļþÖж¨Òå
^
/tmp/ccpdz1oY.o: In function `NS::func1()':
hello.cpp:(.text+0x7): undefined reference to `(anonymous namespace)::func2()'
collect2: error: ld returned 1 exit status
如果是非命名空间,编译链接完全没有问题
hello.cpp内容如下:
#include <iostream> //包含头文件iostream是因为命名空间std在里面声明了
using namespace std;
namespace NS4 //声明命名空间NS4
{
extern void func2(void); //加extern是在另外一个文件中定义
}
namespace NS //有名命名空间,名字就是NS
{
void func1(void)
{
// cout << "func1 from namespace NS" << endl;
NS4::func2();
}
};
int main(void)
{
NS::func1();
// std::cout << "hello world." << std::endl; //cout和endl都定义在std中
return 0;
}
hello2.cpp内容如下:
#include <iostream> //下面使用cout和endl,所以要加他们的声明
using namespace std; //std是C++标准库定义好的一个namespace,一次性声明指定命名空间std里面的所有变量函数等
namespace NS4 //命名空间NS4的定义
{
void func2(void)
{
cout << "func2 from anonymous namespace" << endl;
}
}
3. 匿名命名空间的价值
(1)匿名命名空间中的符号纯文件内部使用,不需要被外部引用
在C语言中做法是在函数等前面加上static