auto, extern, register, static

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

时间: 2024-10-14 18:38:40

auto, extern, register, static的相关文章

C++ auto 与 register、static keyword 浅析

[register/auto的比較分析] #include <iostream> using namespace std; int main(){ int i,sum=0; for(i=0;i<=100;i++) sum+=i; cout<<"The sum="<<sum<<endl; } #include <iostream> using namespace std; int main(){ register int

auto和register关键字

关键字概述 很多朋友看到这儿可能会有疑问,往往其它讲C语言的书籍都是从HelloWorld,数据类型开始C语言学习的,为什么我们要从C语言的关键字开始呢?关于这点,我有两点需要说明: 本章节面向的读者对象是有一定的C语言基础知识的朋友(至少应该学习过大学里的C语言程序设计等类似的课程) 本章节结合了作者多年嵌入式工作.研究.教学经验而作,由计算机底层硬件到上层软件设计融会贯通,中间有大量的深入浅出的示例 在我对C语言进行培训的时候,往往就是从C语言的关键字入手,因为C语言的关键字蕴含了C语言的全

[C]控制外部变量访问权限的extern和static关键字

一.extern 概述 编译器是由上至下编译源文件的,当遇到一些函数引用外部全局变量,而这个变量被定义在该函数声明主体的下方,又或者引用自其它的编译单元,这个情况就需要extern来向编译器表明此变量是一个外部变量 问题1.运用extern实现全局变量声明提升效果 #include <stdio.h> void fun(void); int main(void) { fun(); } void fun(void) { printf("%d\n", v); } int v =

&lt;&lt;黑马程序员&gt;&gt;extern与static的使用注意

extern与static对函数的作用: extern 修饰外部函数 ①  定义的函数可以被本文件和其他文件访问. ②  默认情况下所有函数都是外部函数 ③  不予许有同名的外部函数 extern对函数的作用 ①  完整的声明以个外部函数. ②  完整的定义一个外部函数. static 修饰内部函数 ①  定义的函数只能被本文件访问,其他文件不可以访问. ②  不同文件中可以由同名的内部函数. static对函数的作用 ①  声明一个内部函数. ②  定义一个内部函数. extern 对变量的作

Extern和static

http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编

链接(extern、static关键词\头文件\静态库\共享库)

原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = -1; void push(char c) {         stack[++top] = c; } char pop(void) {         return stack[top--]; } int is_empty(void) {         return top == -1; }

IOS的变量前加extern和static字段

IOS的变量前加extern和static字段 前一阵子,做项目的时候到网上找Demo,打开运行的时候发现其中变量前有关键字extern和static,所以我研究了一下子 对于extern来说可以理解为扩展吧是这样的是从一个类扩展到另一个类中的 在SplashViewController.m中定义一个变量是这样的 #import "SplashViewController.h" NSString* [email protected]"123"; @implement

extern 和 static

 (1) extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量.  (2) static 表示静态的变量,分配内存的时候, 存储在静态区,不存储在栈上面. static 作用范围是内部连接的关系, 和extern有点相反.它和对象本身是分开存储的,extern也是分开存储的, 但是extern可以被其他的对象用extern 引用,而static 不可以,只允许对象本身用它. 具体差别首先,static与extern 是一对“水火不容”的家伙,也就是说extern和static不能

话说extern和static

以前对extern.static的一些东西一直模棱两可.今天好好来梳理了一番.. static关键字 被static修饰的变量或函数称之为静态成员.函数. 存储位置:static修饰的变量存放在静态区(全局区).通常有以下特点: 修饰的变量只能在本源文件中访问 存放在此的变量在程序结束后由os自动释放,生存周期随程序 仅能在编译时期定义初始化一次. 以后操作都是在上次操作结果基础上进行 若是未初始化的静态变量,os将默认为其赋值为0或者空字符 静态局部变量与静态全局变量不同的一点: 虽然静态局部