c语⾔中的命名空间
C语⾔中的命名空间
命名空间是为了解决 “在相同作⽤域内如何区分相同的标识符”。
说明:
①只有在相同作⽤域的情况下才能使⽤到命名空间去区分标识符,在嵌套的作⽤域、不同的作⽤域区分标识符都⽤不到命名空间的概念。
②在相同的作⽤域内,如果命名空间不同,标识符可以使⽤相同的名称。否则,即如果命名空间相同同,编译器会报错,提⽰重复定义。
按照C99(章节6.2.3),命名空间可以分为四种:
c语言中struct1. 所有的标签(label)都属于同⼀个命名空间。说明:①在同⼀个函数内,你的标签不能相同。②在同⼀个函数内,标签可以和其他
变量名称相同。因为它们所属的命名空间不同。
2. struct、enum和union的名称,在C99中称之为tag,所有的tag属于同⼀个命名空间。也就是说,如果你已经声明struct A { int a }; 就
不能在声明 union A{ int a };说明:之所以让所有的tag组成⼀个命名空间,由于Tag前⾯总是带struct,enum或union关键字,所以编译器可以将它们与其他的标识符区分开。
3. struct和union的成员属于⼀个命名空间,⽽且是相互独⽴的。例如:如果你已经声明struct A { int a };其成员的名称为a,你仍然可以
声明 struct B{ int a };或者union B{ int a }; 说明:之所以让struct和union的成员各⾃成为⼀个命名空间,是因为它们的成员访问时,需要通过 "."或"->"运算符,⽽不会单独使⽤,所以编译器可以将它们与其他的标识符区分开。由于枚举类型enum的成员可以单独使⽤,所以枚举类型的成员不在这⼀名称空间内。
4.其他所有的标识符,属于同⼀个名称空间。包括变量名、函数名、函数参数,宏定义、typedef的类型名、enum的成员等等。注意:如果标识符出现重名的情况,宏定义覆盖所有其它标识符,这是因为它在预处理阶段⽽不是编译阶段处理。除了宏定义之外其它类别的标识符,处理规则是:内层作⽤域会隐藏掉外层作⽤域的标识符。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论