7 声明
7 声明
1、声明用于对名字的解析方式进行说明,它具有如下语法形式:
declaration-seq:
declaration
declaration-seq declaration
declaration:
block-declaration
function-definition
template-declaration
explicit-instantiation
explicit-specialization
linkage-specification
namespace-definition
block-declaration:
simple-declaration
asm-definition
namespace-alias-definition
using-declaration
using-directive
simple-declaration:
decl-specifier-seqopt init-declarator-listopt ;
[注意:asm-definitions参见7.4,linkage-specification参见7.5。Function-definitions参见8.4,template-declarations参见14章。Namespace-definitions参见
decl-specifier-seqopt init-declarator-listopt ;
被分为两部分:构成decl-specifier-seq的decl-specifiers参见7.1,构成init-declarator-list的declarators参见第8章。
2、声明发生在特定的作用域(3.3)中;3.4节对作用域规则进行了总结。函数声明或者定义类、名字空间、模板、函数的声明都具有嵌套的作用域。这些嵌套的作用域又能包含嵌套的声明。
3、在simple-declaration中,仅当声明类(第9章)或枚举(7.2)类型的时候,也就是说仅当decl-specifier-seq中包含class-specifier,或者具有class-key(9.1)的elaborated-type-specifier,或者enum-specifier的时候,init-declarator-list才可省去。在这些情况下,以及在class-specifier或enum-specifier出现于decl-specifier-seq中的任何时候,说明符中的标识符出现在声明的名字之中(作为class-names, enum-names, 或者enumerators, 具体依语法而定)。这些情况下,除非是声明未具名的位域(9.6),decl-specifier-seq必须引入一个或多个名字,或者重新声明先前的声明所引入的名字。例如:
enum { }; // ill-formed
typedef class { }; // ill-formed
(上述的意思好像是说定义类或枚举类型的时候,必须加上标签。另外,像enum{ };的声明在VC6.0中是可以顺利通过编译的;声明typedef class { };则会产生一个警告错误:warning C4094: untagged 'class' declared no symbols。)
4、init-declarator-list中的每个init-declarator都必须包含唯一的declarator-id,它是init-declarator声明的名字,因而也是declaration所声明的名字之一。decl-specifier-seq中的type-specifiers,以及init-declarator中的递归declarator结构都是类型描述,这个类型稍后和init-declarator所声明的名字相关联。
5、如果decl-specifier-seq包含typedef说明符,那么声明称为类型定义声明。init-declarator所声明的每一个名字相应的称为类型定义名,语义上是它所关联类型的同义词(
6、声明的语法形式之外的句法成分被添加到函数声明中,以期构成一个函数定义。一个对象声明也是一个对象定义,除非声明包含extern说明符并且不含初始化体(3.1)。一个定义通知编译器预留适量的存储空间和进行适当的初始化(8.5)。
7、仅在声明构造函数、析构函数和类型转换函数的情况下,decl-specifier-seq可被省去(此时,C语言中“implicit int”的规则不再适用)。