存储类
函数定义中的存储类说明符为函数提供 extern
或 static
存储类。
语法
function-definition
:
declaration-specifiers
opt attribute-seq
opt declarator
declaration-list
opt compound-statement
/* attribute-seq
为 Microsoft 专用 */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
storage-class-specifier
: /* 用于函数定义 */
extern
static
如果函数定义不包括 storage-class-specifier
,则存储类默认为 extern
。 可以将函数显式声明为 extern
,但这不是必需的。
如果函数的声明包含 storage-class-specifier
extern
,则标识符的链接与带文件范围的标识符的任何可见声明相同。 如果没有带文件范围的可见声明,则标识符具有外部链接。 如果标识符具有文件范围但没有 storage-class-specifier
,则标识符具有外部链接。 外部链接意味着,标识符的每个实例表示相同的对象或函数。 有关链接和文件范围的详细信息,请参阅生存期、范围、可见性和链接。
带 extern
之外的存储类说明符的块范围数声明将生成错误。
包含 static
存储类的函数只在定义它的源文件中可见。 其他所有函数(无论是显式还是隐式地为它们提供 extern
存储类)在程序中的所有源文件中都可见。 如果需要 static
存储类,则必须在函数的第一个声明(若有)和函数定义中声明它。
Microsoft 专用
在 Microsoft 扩展启用后,如果函数定义在同一源文件中,且定义显式指定 static
存储类,则会为最初没有使用存储类(或使用 extern
存储类)声明的函数提供 static
存储类。
当使用 /Ze 编译器选项进行编译时,在块内使用 extern
关键字声明的函数具有全局可见性,而使用 /Za 编译时则不然。 如果需要考虑源代码的可移植性,则不应依赖此功能。
结束 Microsoft 专用