外部变量是在文件范围。它们在所有功能外部定义,并且,它们对许多功能有可能可用。函数只能定义该外部级别,因此,因此,不能嵌套。默认情况下,所有对外部变量,并具有相同名称的函数是对同一对象,这意味着它们具有 “外部链接”。(可以使用 静态 关键字重写此操作。有关更多详细信息后参见信息本节有关 静态。)
在该外部级别的变量声明为变量的定义 (“定义声明”),或对其他位置定义的变量 (“提供了”)。
还初始化该变量的外部变量声明 (隐式或显式) 是变量的定义的说明。在该外部级别的定义可能采用多种形式:
您声明了 静态 存储类说明符的变量。可以显式初始化常量表达式的 静态 变量,如 初始化所述。如果省略该初始值设定项,默认情况下该变量初始化为 0。例如,这两个语句是可变 k的两个考虑的定义。
static int k = 16; static int k;
您显式初始化该外部级别的变量。例如, int j = 3; 是可变 j的定义。
在该外部级别的变量声明 (即在这些函数),可以使用 静态 或 extern 存储类说明符或完全省略这种存储类说明符。不能使用 自动 和 注册存储类说明符 终端在该外部级别。
一个变量定义外部级别,它是显示在翻译单元的其余部分中。该变量位于其在同一源文件中声明之前不可见。此外,它如下所述未显示在程序的其他源文件,在中,除非引用的声明使其可见,。
与 静态 相关的规则包括:
声明外部的变量所有块,而无需 静态 关键字始终保留它们在程序中的值。若要限制其绑定到特定的翻译单元的访问,您必须使用 静态 关键字。这使它们 “内部联接”。使这些全局到整个程序,忽略显式存储类或使用关键字 extern (参见下的规则列表)。这使它们 “外部链接”。内部和外部链接在 连接还讨论。
可以一次只定义变量在外部级别在程序中。可以定义具有相同名称的另一个变量和在不同的翻译单元的 静态 存储类说明符。因为每个 静态 定义在其自己的翻译单元中仅显示,不发生冲突。这提供了一种有用的方式隐藏必须在单个翻译单元的共享函数的标识符名称,但是,不可见到其他翻译单元。
静态 存储类说明符能应用于函数。如果声明函数 静态,其名称是它声明文件中不可见的外部。
规则用于 extern 是:
extern 存储类说明符声明对其他位置定义的变量。可以使用 extern 声明使在另一个源文件的定义可见,或使变量显示在其在同一源文件中定义之前。一旦声明对该变量在该外部级别,该变量是显示在声明的引用进行翻译单元的其余部分中。
对于其引用的 extern 引用有效,该变量必须一个和一次只定义,该外部级别。此定义 (不 extern 存储类) 可以在组合程序的任何翻译单元。
示例
下面的示例阐释了外部声明:
/******************************************************************
SOURCE FILE ONE
*******************************************************************/
#include <stdio.h>
extern int i; // Reference to i, defined below
void next( void ); // Function prototype
int main()
{
i++;
printf_s( "%d\n", i ); // i equals 4
next();
}
int i = 3; // Definition of i
void next( void )
{
i++;
printf_s( "%d\n", i ); // i equals 5
other();
}
/******************************************************************
SOURCE FILE TWO
*******************************************************************/
#include <stdio.h>
extern int i; // Reference to i in
// first source file
void other( void )
{
i++;
printf_s( "%d\n", i ); // i equals 6
}
在本示例中的两个源文件包含 i总计三个外部声明。只有一个声明是 “定义声明”。该声明,
int i = 3;
定义全局变量 i 并将其初始化为使用初始值 3。“引用” i 的说明在使用 extern 的第一个源文件的顶部使全局变量可见在其文件中定义的声明之前。i 引用的声明在第二个源文件也使变量显示在该源文件。如果变量的定义的实例在该翻译单元不提供,编译器假定有
extern int x;
提供了与定义引用
int x = 0;
出现在过程的另一个翻译单元。
所有三个功能, main、 next和 other,执行相同任务:它们添加 i 并将其打印。值 4、 5 和 6,打印。
如果变量的 i 未初始化,则将自动设置为 0。在这种情况下,值 1、 2 和 3,要打印。有关变量的初始化的信息,请参见 初始化 。