外部存储类说明符

声明的变量 extern 存储类说明符是对同名的变量定义在的外部级别任何程序的源文件。内部 extern 声明用于使该外部级变量定义在块内可见。除非声明一个外部级别,声明的变量 extern 关键字是只显示在声明它的块。

示例

此示例演示内部和外部级声明:

// extern_StorageClassSpecified.c
#include <stdio.h>

void other( void );

int main()
{
    // Reference to i, defined below: 
    extern int i;

    // Initial value is zero; a is visible only within main: 
    static int a;

    // b is stored in a register, if possible: 
    register int b = 0;

    // Default storage class is auto: 
    int c = 0;

    // Values printed are 1, 0, 0, 0: 
    printf_s( "%d\n%d\n%d\n%d\n", i, a, b, c );
    other();
    return;
}

int i = 1;

void other( void )
{
    // Address of global i assigned to pointer variable:
    static int *external_i = &i;

    // i is redefined; global i no longer visible: 
    int i = 16;

    // This a is visible only within the other function: 
    static int a = 2;

    a += 2;
    // Values printed are 16, 4, and 1:
    printf_s( "%d\n%d\n%d\n", i, a, *external_i );
}

在此示例中,变量 i 定义在使用初始值 1. 的外部级别。在 main 函数的一个 extern 阐释用于声明对外部级 i。,因为该初始值设定项中提及,默认情况下 静态 变量的 a 初始化为 0。为 printf 的调用打印值 1, 0, 0 和 0。

在 other 功能,全局变量 i 的地址用于初始化 静态 指针变量 external_i。可以这样做,因为全局变量具有 静态 生存期,这意味着其地址不在程序执行期间更改。接下来,变量 i 重新定义为与原始值 16 的局部变量。此重新定义不影响外部级 i的值,隐藏使用其名称局部变量。全局 i 的值中是可访问的通过指针 external_i间接只现在被阻塞,。,因为它可能不同的块每次生成输入,尝试分配 自动 变量的 i 的地址为指针不起作用。变量 a 声明为变量 静态 并初始化为 2。此 a 不冲突与 main的 a ,,因为在内部级别的 静态 变量在声明它们的块中才可见。

2 增加该变量 a ,为 4 作为结果。如果 other 功能在同一程序再次调用, a 的初始值为 4。内部 静态 变量保留它们的值,在程序退出然后重新输入声明的块时。

请参见

概念

内部级声明的存储类说明符