标签:erro 全局数据区 初始化 示例 打印 register std i++ class
C语言的变量属性:
auto关键字:
register关键字:
全局变量不能定义为register型的变量,因为它的生命周期是从程序开始到结束的,不可能让一个变量始终占据寄存器。
static关键字:
示例程序:
1 #include <stdio.h> 2 3 int f1() 4 { 5 int r = 0; 6 7 r++; 8 9 return r; 10 } 11 12 int f2() 13 { 14 static int r = 0; 15 16 r++; 17 18 return r; 19 } 20 21 22 int main() 23 { 24 auto int i = 0; // 显示声明 auto 属性,i 为栈变量 25 static int k = 0; // 局部变量 k 的存储区位于静态区,作用域位于 main 中 26 register int j = 0; // 向编译器申请将 j 存储于寄存器中 27 28 printf("%p\n", &i); 29 printf("%p\n", &k); 30 printf("%p\n", &j); // error 31 32 for(i=0; i<5; i++) 33 { 34 printf("%d\n", f1()); 35 } 36 37 for(i=0; i<5; i++) 38 { 39 printf("%d\n", f2()); 40 } 41 42 return 0; 43 }
第30行打印寄存器变量的地址,是错误的。
注释掉错误行,运行结果如下:
f2中的r变量存储在全局数据区,只会被初始化一次。而且每次对它的改动都会被保留下来。
extern关键字:
extern定义变量时是告诉编译器,这个变量是在其它文件分配存储空间的。
示例如下:
extern告诉编译器,g_i是在其它地方定义的,之后一定会找到它的,现在可以放心使用。
static和extern是互斥的,static将全局变量变为只在当前文件作用域。
在一个文件A中定义全局变量,定义为static修饰的,然后提供get和set函数,在另一个文件中用extern声明这些函数(声明函数时,编译器默认加上extern),然后在这个文件中就可以用这些函数来操作A文件中的“全局变量”了,但是不能直接操作这个变量,这就起到了隔离的作用,类似于C++中的类。
小结:
标签:erro 全局数据区 初始化 示例 打印 register std i++ class
原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9532594.html