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.4linkage-specification参见7.5Function-definitions参见8.4template-declarations参见14章。Namespace-definitions参见7.3.1using-declarations参见7.3.3using-directives参见7.3.4] simple-declaration

              decl-specifier-seqopt init-declarator-listopt ;

被分为两部分:构成decl-specifier-seqdecl-specifiers参见7.1,构成init-declarator-listdeclarators参见第8章。

 

2、声明发生在特定的作用域(3.3)中;3.4节对作用域规则进行了总结。函数声明或者定义类、名字空间、模板、函数的声明都具有嵌套的作用域。这些嵌套的作用域又能包含嵌套的声明。

 

3、在simple-declaration中,仅当声明类(第9章)或枚举(7.2)类型的时候,也就是说仅当decl-specifier-seq中包含class-specifier,或者具有class-key9.1)的elaborated-type-specifier,或者enum-specifier的时候,init-declarator-list才可省去。在这些情况下,以及在class-specifierenum-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。)

 

4init-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所声明的每一个名字相应的称为类型定义名,语义上是它所关联类型的同义词(7.1.3)。如果decl-specifier-seq不包含typedef说明符,在名字与函数类型(8.3.5)相关联的情况下,声明被称为函数声明,否则为对象声明

 

6、声明的语法形式之外的句法成分被添加到函数声明中,以期构成一个函数定义。一个对象声明也是一个对象定义,除非声明包含extern说明符并且不含初始化体(3.1)。一个定义通知编译器预留适量的存储空间和进行适当的初始化(8.5)。

 

7、仅在声明构造函数、析构函数和类型转换函数的情况下,decl-specifier-seq可被省去(此时,C语言中“implicit int”的规则不再适用)。

posted @ 2006-03-27 16:15  Goncely  阅读(215)  评论(0编辑  收藏  举报