C99标准 6.2.1 标识符的作用域

C99标准 6.2.1 标识符的作用域

  标识符(identifier)可以表示一个对象;一个函数;一个结构、联合或枚举的标签(tag)或成员;类型名;一个标号(label)名;一个宏名;或者一个宏参数。同一个标识符可以在程序的不同点表示不同的实体。枚举的成员称为枚举常量。这里不再进一步考虑宏名和宏参数,因为在程序翻译的语义阶段之前,源文件中出现的任何宏名都被构成宏定义的预处理符号(preprocessing token)序列所取代。

  对于标识符指定的每个不同实体,该标识符只能在称为其作用域的程序文本区域内可见(即可以使用)。由同一标识符指定的不同实体要么具有不同的作用域,要么位于不同的名称空间(name space)中。有四种作用域(scope):函数、文件、块和函数原型。(函数原型是声明函数形参类型的函数的声明。)

  标号名是唯一一种具有函数作用域的标识符[1]。它可以(在goto语句中)在函数中的任何地方使用,并通过其语法外观(后面跟着一个:和一条语句[2])隐式声明。

[1]【译者注】goto语句只能在函数中跳转,不能在函数间跳转。
[2]【译者注】标号后面至少要有一条语句。

  每个其他标识符的作用域由其声明的位置决定(在声明符类型说明符中)。如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则该标识符具有文件作用域,该作用域在翻译单元的末尾终止。如果声明标识符的声明符或类型说明符出现在块中或函数定义中的参数声明列表中,则该标识符具有块作用域,该作用域终止于相关块的末尾。如果声明标识符的声明符或类型说明符出现在函数原型(不是函数定义的一部分)中的形参声明列表中,标识符具有函数原型作用域,该作用域终止于函数声明符的末尾[3]。如果一个标识符在同一个名称空间中指定了两个不同的实体,作用域可能会重叠。如果是,一个实体的作用域(内部作用域)将是另一个实体的作用域(外部作用域)的严格子集。在内部作用域中,标识符指定在内部作用域中声明的实体;在外部作用域中声明的实体在内部隐藏(不可见)。

[3]【译者注】对于函数原型 int fun(int identifier1, char identifier2); identifier1和identifier2的作用域终止于该原型后面的分号(;),即函数原型中的标识符的作用域仅局限于该函数原型中

  除非另有明确说明,本标准使用该术语时“identifier”指的是某个实体(与语法构造相反),它指的是相关名称空间中的实体,该实体的声明在标识符出现的地方是可见的。

  当且仅当两个标识符的作用域在同一点终止时,它们具有相同的作用域。

  结构、联合和枚举标签(tag)[4]的作用域从声明标签的类型说明符中的标签出现之后开始。每个枚举常量的作用域从枚举数列表中其定义的枚举数出现之后开始。任何其他标识符的作用域都是从它的声明符完成之后开始的。

[4]【译者注】struct identifier {list}; 中的identifier就是一个tag,同样是结构体类型,其成员可能不尽相同,因此需要一个额外的标签来进一步说明,而不能直接使用struct来声明结构体变量

提前引用:声明(6.7),函数调用(6.5.2.2),函数定义(6.9.1),标识符(6.4.2),标识符的名称空间(6.2.3),宏替换(6.10.3),源文件包含(6.10.2),语句(6.8)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值