《Thinking in C++, 2nd Edition》笔记-第十章(Name Control)
static关键字有时控制存储分配,而有时控制一个名字的可见性和连接。它的含义因此经常是相互冲突的:
(1)在静态数据区上创建对象,而不是每次函数调用时在堆栈上产生。这也是静态存储的概念。
如果想在两次函数调用之间保留一个变量的值,我们可以通过定义一个全局变量来实现这点,但这样一来,这个变量就不仅仅受这个函数的控制,还受其它函数影响。C和C++都允许在函数内部创建一个static对象,这个对象将存储在程序的静态数据区中,而不是在堆栈中。这个对象只在函数第一次调用时初始化一次,以后它将在两次函数之间保持它的值。
(2)对一个特定的编译单元来说是本地的。这个名字在这个单元或类之外是不可见的。这描述了连接的概念,决定连接器看到哪些名字。
在文件范围内,一个被明确声明为static的对象或函数的名字对编译单元(也就是出现声明的. CPP文件)来说是局部变量;这些名字有内部连接。这意味着我们可以在其他的编译单元中使用同样的名字,而不会发生名字冲突。
定义一个全局变量 int a=0; 则a存储在程序的静态数据区,在进入main()函数之前,a已经被初始化。a对全局可见。因此与static相反,它是extern的,所以这个定义与这个定义是相同的:extern int a = 0;
但是如果:static int a = 0; 意味着a成了一个内部连接。但它依然存储在静态数据区,并不会改变存储类型,只是改变了可见性。
名字空间的关键字,像class , struct , enum和union一样,把它们的成员的名字放到了不同的空间中去,尽管其他的关键字有其他的目的,但namespace唯一的目的是产生一个新的名字空间。
1) namespace只能在全局范畴定义,但它们之间可以互相嵌套。
2) 在namespace定义的结尾,右大括号的后面不必要跟一个分号。
3) 一个namespace可以在多个头文件中用一个标识符来定义,就好象重复定义一个类一样。
extern "C" { #include "Myheader.h" }