“声明”指定一组标识符的解释和属性。 还会导致为标识符命名的对象或函数保留存储的声明称为“定义”。变量、函数和类型的 C 声明具有以下语法:
语法
declaration:
declaration-specifiers
attribute-seq
选择init-declarator-list选择;
/*
attribute-seq
opt 是特定于Microsoft */
declaration-specifiers:
storage-class-specifier
declaration-specifiers
选择
type-specifier
declaration-specifiers
选择
type-qualifier
declaration-specifiers
选择
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存储类与其他存储类说明符一起允许,并且允许多次存储类。 声明的存储类说明符会影响声明项的存储和初始化方式,以及程序的哪些部分可以引用该项。
storage-class-specifier C 中定义的终端包括auto、extern、register和statictypedef。 Microsoft C 还包括 storage-class-specifier 终端 __declspec。 除存储类外typedef,__declspec所有storage-class-specifier终端都进行了讨论。 有关的信息 typedef,请参阅 typedef 声明。 有关的信息 __declspec,请参阅 扩展 Storage-Class 属性。
声明在源程序中的位置以及变量的其他声明是否存在是确定变量生存期的重要因素。 可以多次重新声明,但只能有一个定义。 但是,定义可以出现在多个翻译单元中。 对于具有内部链接的对象,此规则单独应用于每个翻译单元,因为内部链接的对象对翻译单元是唯一的。 对于具有外部链接的对象,此规则适用于整个程序。 有关可见性的详细信息,请参阅 生存期、范围、可见性和链接。
类型说明符提供有关标识符数据类型的一些信息。 默认类型说明符为 int. 有关详细信息,请参阅 类型说明符。 类型说明符还可以定义类型标记、结构和联合组件名称和枚举常量。 有关详细信息,请参阅 枚举声明、 结构声明和 联合声明。
有两个 type-qualifier 终端: const 和 volatile。 这些限定符指定仅当通过 l 值访问该类型的对象时才相关的类型的额外属性。 有关详细信息 const , volatile请参阅 类型限定符。 有关 l 值的定义,请参阅 L-Value 和 R-Value 表达式。