示例
//Visual Studio中加上这句才可以使用scanf() //否则只能使用scanf_s() #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <ctype.h> //malloc()、free() #include <stdlib.h> #include <time.h> //外部: 变量定义在所有函数外面 //文件作用域: 从变量的声明处到文件尾 /* 外部变量具有静态存储期。因此,无论程序执行到main()、next() 还是其他函数,数组Up及其值都一直存在。 */ int Errupt = 10; /*外部定义的变量*/ double Up[100]; /*外部定义的数组*/ extern char Coal; /*如果Coal被定义在另一个文件中, 则必须这样声明*/ void next(void); //argc: 参数个数 argv[]: 参数数组 //int main(int argc, char **argv) int main(int argc, char *argv[]) { extern int Errupt; //可选的声明 extern double Up[]; //可选的声明 //块作用域中的变量将隐藏文件作用域中的变量 //int Errupt; //创建了一个自动变量 //加上auto明确声明自动变量 //auto int Errupt; printf("main Errupt=%d\n", Errupt); next(); system("pause"); return 0; } /* 外部变量的作用域:从声明处到文件尾。*/ int Pocus; //只对next()可见 /* 初始化外部变量 外部变量和自动变量类似,也可以被显式初始化。与自动变量不同的是,如果未初始化 外部变量,它们会被自动初始化为0.这一原则也适用于外部定义的数组元素。与自动 变量的情况不同,只能使用常量表达式初始化文件作用域变量。 */ int x = 10; int y = 3 + 20; size_t z = sizeof(int); //int x2 = 2 * x; //不行,x是变量 //(只要不是变长数组,sizeof表达式可被视为常量表达式) void next() { printf("next Errupt=%d\n", Errupt); }
运行测试
C99和C11标准都要求编译器识别局部标识符的前63个字符和外部标识符的前31个字符。这修订了以前的标准,即编译器识别局部标识符前31个字符和外部标识符前6个字符。你所用的编译器可能还执行以前的规则。外部变量名比局部变量名的规则严格,是因为外部变量名还要遵循局部环境规则,所受的限制更多。