存储类

函数定义中的存储类说明符为函数提供 externstatic 存储类。

语法

function-definition
declaration-specifiersopt attribute-seqopt declarator declaration-listopt compound-statement

/* attribute-seq 为 Microsoft 专用 */

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

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 专用

请参阅

C 函数定义