C语言中的名字空间

C语言中的命名空间

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

  1. 只有在相同作用域的情况下才能使用到命名空间去区分标识符,在嵌套的作用域、不同的作用域区分标识符都用不到命名空间的概念。
  2. 在相同的作用域内,如果命名空间不同,标识符可以使用相同的名称。否则,即如果命名空间相同同,编译器会报错,提示重复定义。

按照C99(章节6.2.3),命名空间可以分为四种:

  1. 所有的标签(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的成员 等等。注意:如果标识符出现重名的情况,宏定义覆盖所有其它标识符,这是因为它在预处理阶段而不是编译阶段处理。除了宏定义之外其它类别的标识符,处理规则是:内层作用域会隐藏掉外层作用域的标识符。

对照英文:

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

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).

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值