命名空间、头文件带h后缀和不带h后缀的区别

时间:2024-03-08 21:51:16

namespace概念

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。

在c语言开发中存在一个比较尴尬的局面就是:比如有两个库文件中同时定义了全局变量,那么如果我们在实际开发中要使用到这两个库文件,这时,引用这个变量就变得混淆不清了,c++中怎么避开这个问题发生呢——引入命名空间(全局变量区间不是一个,而是被划分了多个相互独立的全局域),不同的命名空间表示不同的全局区,像std就是一个命名空间,它就标识了一个全局域,如果此时又有另一个命名空间中也定以了cout对象(这里,我自己杜撰一个命名空间——sdc),那么怎么标识程序使用那个命名空间的cout对象呢?——使用 using namespace std;来显示的表明,如果程序中出现了cout,那么一定是std空间全局域中的cout对象,而不会再产生疑惑了。——这就是命名空间的作用。

C中的命名空间

         在C语言中只有一个全局作用域

         C语言中所有的全局标识符共享同一个作用域

         标识符之间可能发生冲突

C++中提出了命名空间的概念

         命名空间将全局作用域分成不同的部分

         不同命名空间中的标识符可以同名而不会发生冲突

         命名空间可以相互嵌套

         全局作用域也叫默认命名空间

 

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;

2、使用using关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl;

3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex << 3.4 << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名 时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。

 

C++命名空间的定义:

         namespace name {  …  }

C++命名空间的使用:

      使用整个命名空间:using namespace name;

  使用命名空间中的变量:using name::variable;

  使用默认命名空间中的变量:::variable

  默认情况下可以直接使用默 认命名空间中的所有标识符

 1 namespace NameSpaceA
 2 {
 3     int a = 0;
 4 }
 5 
 6 namespace NameSpaceB
 7 {
 8     int a = 1;
 9 
10     namespace NameSpaceC
11     {
12         struct Teacher
13         {
14             char name[10];
15             int age;
16         };
17 
18     }
19 }
20 
21 int main()
22 {
23     using namespace NameSpaceA;
24     using NameSpaceB::NameSpaceC::Teacher;  //::域作用符
25 
26     printf("a = %d\n", a);
27     printf("a = %d\n", NameSpaceB::a);
28 
29     Teacher t1 = {"aaa", 3};
30 
31     printf("t1.name = %s\n", t1.name);
32     printf("t1.age = %d\n", t1.age);
33 
34     system("pause");
35     return 0;
36 }

 

头文件带h后缀和不带h后缀的区别:

带h后缀的文件,是c标准的头文件,它在c++中的存在是为了兼容c开发标准而已,它的内容与不带h后缀的头文件(c++标准头文件)是不同的。

在c++开发中,包含一个标准c++头文件之后,不是说就可以使用在它中定义的标识了,还需要使用namespace 来指定使用那个命名空间,起码需要指明你需要使用到的标识(一般为变量,对象也是变量的一种)是来自那个命名空间。但是c标准中,只有一个全局域,所以没有命名空间一说了,或者说成整个全局域就是它的唯一命名空间。所以不需要再指明命名空间了,但是正如前面说的一样,这样会导致多个头文件下的相同标识引用不清的局面。

 

总结:

1)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。若不引入using namespace std ,需要这样做。std::cout

2)   c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h

3)   C++命名空间的定义:   namespace name {  …  }

4)   using namespace NameSpaceA;

5namespce定义可嵌套。