声明概述

“声明”指定一组标识符的解释和特性。 还会导致针对标识符命名的对象或函数保留存储的声明将称为“定义”。用于变量、函数和类型的 C 声明都具有以下语法:

语法

declaration
declaration-specifiers attribute-seqopt init-declarator-listopt ;

/* attribute-seqopt 为 Microsoft 专用 */

declaration-specifiers
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt

init-declarator-list
init-declarator
init-declarator-list , init-declarator

init-declarator
declarator
declarator = initializer

注意

用于 declaration 的这种语法在以下部分中不重复。 以下部分中的语法通常以 declarator 非终止符开头。

init-declarator-list 中的声明包含要命名的标识符;init 是初始值设定项的缩写。 init-declarator-list 是用逗号分隔的声明符序列,其中每个声明符都可以有额外的类型信息和/或初始值设定项。 declarator 包含要声明的标识符(如果有)。 declaration-specifiers 非终止符是由类型和存储类说明符的序列组成,这些说明符指明链接、存储持续时间,以及声明符表示的实体的至少一部分类型。 声明由存储类说明符、类型说明符、类型限定符、声明符和初始值设定项的某种组合组成。

声明可以包含 attribute-seq 中列出的一个或多个可选特性;seq 是序列的缩写。 这些特定于 Microsoft 的特性执行多个函数,本书中将详细介绍这些函数。

在一般形式的变量声明中,type-specifier 给出变量的数据类型。 type-specifier 可以是复合的,就像类型被 constvolatile 修改时。 declarator 可为变量命名,并可能将其修改以用于声明数组类型或指针类型。 例如,应用于对象的

int const *fp;

将名为 fp 的变量声明为指向不可修改的 (const) int 值的指针。 可以使用多个声明符(用逗号分隔)来定义声明中的多个变量。

声明必须至少具有一个声明符,或者其类型说明符必须声明一个结构标记、联合标记或枚举的成员。 声明符提供有关标识符的所有剩余信息。 声明符是一种标识符,可以用方括号 ([ ])、星号 (*) 或圆括号 (( )) 进行修改,以分别声明数组、指针或函数类型。 在声明简单变量(例如字符、整数和浮点项)或简单变量的结构和联合时,declarator 只是一个标识符。 有关声明符的详细信息,请参阅声明符和变量声明

所有定义都为隐式声明,但并非所有声明都为定义声明。 例如,使用 extern 存储类说明符的变量声明是“引用”声明,而不是“定义”声明。 如果要在定义外部变量之前引用它,或者如果在使用它的源文件之外的另一个源文件中定义它,则需要 extern 声明。 存储无法由“引用”声明分配,也不能在声明中初始化变量。

变量声明中需要存储类或类型(或者这两者)。 除了 __declspec,声明中只允许包含一个存储类说明符,并且并非每一个上下文中都允许存在所有存储类说明符。 允许将 __declspec 存储类与其他存储类说明符一起使用,并且允许使用不止一次。 声明的存储类说明符会影响存储和初始化声明的项的方式,还会影响程序中的哪些部分可以引用该项。

在 C 中定义的 storage-class-specifier 终止符包括 autoexternregisterstatictypedef。 Microsoft C 还包括 storage-class-specifier 终止符 __declspec存储类中讨论了除 typedef__declspec 之外的所有 storage-class-specifier 终止符。 若要了解 typedef,请参阅 typedef 声明。 若要了解 __declspec,请参阅扩展的存储类特性

源程序中声明的位置以及变量的其他声明存在与否是确定变量生存期的重要因素。 可以有多个重新声明,但只能有一个定义。 但是,定义可以出现在多个翻译单元中。 对于带内部链接的对象,此规则可分别应用到每个翻译单元,因为内部链接的对象对翻译单元是唯一的。 对于带外部链接的对象,此规则适用于整个程序。 若要详细了解可见性,请参阅生存期、范围、可见性和链接

类型说明符提供了一些有关标识符的数据类型的信息。 默认类型说明符是 int。 有关详细信息,请参阅类型说明符。 类型说明符还可以定义类型标记、结构和联合组件名称以及枚举常量。 有关详细信息,请参阅枚举声明结构声明联合声明

有两个 type-qualifier 终止符:constvolatile。 这些限定符指定仅在通过左值访问该类型的对象时才相关的类型的额外属性。 若要详细了解 constvolatile,请参阅类型限定符。 有关左值的定义,请参阅左值和右值表达式

请参阅

C 语言语法摘要
声明和类型
声明摘要