C语言中的名字空间

C语言中的命名空间

命名空间是为了解决 “在相同做用域内如何区分相同的标识符”。
说明:express

  1. 只有在相同做用域的状况下才能使用到命名空间去区分标识符,在嵌套的做用域、不一样的做用域区分标识符都用不到命名空间的概念。
  2. 在相同的做用域内,若是命名空间不一样,标识符能够使用相同的名称。不然,即若是命名空间相同同,编译器会报错,提示重复定义。

按照C99(章节6.2.3),命名空间能够分为四种:ide

  1. 全部的标签(label)都属于同一个命名空间。 说明:①在同一个函数内,你的标签不能相同。②在同一个函数内,标签能够和其余变量名称相同。由于它们所属的命名空间不一样。函数

  2. struct、enum和union的名称,在C99中称之为tag,全部的tag属于同一个命名空间。 也就是说,若是你已经声明struct A { int a }; 就不能在声明 union A{ int a };说明:之因此让全部的tag组成一个命名空间,因为Tag前面老是带struct,enum或union关键字,因此编译器能够将它们与其余的标识符区分开。spa

  3. struct和union的成员属于一个命名空间,并且是相互独立的。例如:若是你已经声明struct A { int a };其成员的名称为a,你仍然能够声明 struct B{ int a };或者union B{ int a }; 说明:之因此让struct和union的成员各自成为一个命名空间,是由于它们的成员访问时,须要经过 "."或"->"运算符,而不会单独使用,因此编译器能够将它们与其余的标识符区分开。因为枚举类型enum的成员能够单独使用,因此枚举类型的成员不在这一名称空间内。作用域

  4. 其余全部的标识符,属于同一个名称空间。包括变量名、函数名、函数参数,宏定义、typedef的类型名、enum的成员 等等。注意:若是标识符出现重名的状况,宏定义覆盖全部其它标识符,这是由于它在预处理阶段而不是编译阶段处理。除了宏定义以外其它类别的标识符,处理规则是:内层做用域会隐藏掉外层做用域的标识符。编译器

对照英文:it

label names (disambiguated by the syntax of the label declaration and use);io

the tags of structures, unions, and enumerations (disambiguated by following any24) of the keywords struct, union, or enum); 编译

the members of structures or unions; each structure or union has a separate name space for its members (disambiguated by the type of the expression used to access the member via the . or -> operator);变量

all other identifiers, called ordinary identifiers (declared in ordinary declarators or as enumeration constants).