1 auto
2 extern
3 register
4 static
1 auto
auto用于软件工程规范,让代码清晰易懂,如果只是为了程序可以跑起来,可加可不加。
自动变量int num;等价于auto int num;
自动变量int num=10;等价于auto int num=10;
自动变量没有声明,只有定义。
int num;
int num=10;都是定义
2 extern
extern全局变量有定义和声明的区别。
声明只是声明变量的存在,定义就是全局变量的实体。
全局变量声明:extern num;等价于extern int num;
全局变量定义:extern num=10;等价于extern int num=10;
声明可以多个,定义只有一个。
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int num;//声明 7 int num;//声明 8 int num = 10;//定义 9 int num = 10;//重定义,报错 10 11 main() 12 { 13 14 15 system("pause"); 16 }
只有声明,不省略extern,没有定义,报错:
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 extern int data;//仅仅有声明,没有定义,找不到data的实体 7 extern int data; 8 extern int data; 9 10 main() 11 { 12 printf("%d\n", data); 13 14 system("pause"); 15 }
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2001 无法解析的外部符号 _date hello F:\users\denggelin\documents\visual studio 2015\Projects\hello\hello\hello.obj 1
只有声明,省略extern,没有定义,正常,系统默认初始化为0:
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int data;//仅仅有声明,没有定义,找不到data的实体 7 int data; 8 int data; 9 10 main() 11 { 12 printf("%d\n", data); 13 14 system("pause"); 15 }
输出结果:
0
请按任意键继续. . .
只有声明,省略extern,没有定义,数组,系统默认初始化为0:
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 int a[3]; 7 int a[3]; 8 int a[3];//全部默认初始化为0 9 10 main() 11 { 12 printf("%d\n", a[0]); 13 printf("%d\n", a[1]); 14 printf("%d\n", a[2]); 15 16 system("pause"); 17 }
输出结果:
0
0
0
请按任意键继续. . .
只有声明,省略extern,没有定义,结构体,系统默认初始化为0:
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 struct info 7 { 8 int num; 9 char str[50]; 10 }; 11 12 struct info info1; 13 struct info info1; 14 struct info info1; 15 16 17 main() 18 { 19 printf("%d\n", info1.num); 20 printf("%s\n", info1.str); 21 printf("%d\n", info1.num); 22 printf("%s\n", info1.str); 23 24 system("pause"); 25 }
输出结果:
0
0
请按任意键继续. . .
3 register
register寄存器变量在CPU,没有内存地址。
寄存器变量在CPU内部,速度快。
所以频繁使用的变量,需要放在寄存器可以提高速度。
VC会自动优化,即使没有声明寄存器变量,VC也会自动优化。
GCC就不会自动优化。
全局变量最好不要占用寄存器,占用了,会影响程序的速度。
静态变量不可以放在寄存器。
register static int num;会报错
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2159 指定了一个以上的存储类 hello F:\users\denggelin\documents\visual studio 2015\Projects\hello\hello\hello.c 17
4 static
static静态变量,一直存在,值没有变化,地址也没有变化。
auto自动变量,函数调用的时候,就存在,函数结束的时候,就终止。地址都是同一地址,但是内容却反复变化。
123