博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
static和extern的用法小结
阅读量:5772 次
发布时间:2019-06-18

本文共 3135 字,大约阅读时间需要 10 分钟。

以前写程序是,基本不管static和extern,一个工程文件也只有一个c文件。今天尝试用多个文件来写,自然就涉及到这两个关键词的使用,自己查了些资料,并且做了些实验,总结如下。

 

extern的用法

  • 可以扩展外部变量的作用域

如果在程序中某个地方定义了一个外部变量, 那么使用extern就可以扩展它的作用域。

举个栗子

1 #include 
2 3 using namespace std; 4 void fun(); 5 6 int main() 7 { 8 extern int t; //将外部变量t的作用域拓展到从此处开始 9 fun();10 cout << "t=" << t << endl;11 return 0;12 }13 14 int t;15 void fun()16 {17 t = 100;18 }

 输出为

如果没有extern那句,主函数在执行到  cout << "t=" << t << endl  这句时,就不知道 t 是啥玩意。

但是要说明一点, 即使没有extern那句, fun() 函数也能顺利执行。

栗子:

1 #include 
2 3 using namespace std; 4 void fun(); 5 6 int main() 7 { 8 // extern int t; 9 fun();10 return 0;11 }12 13 int t = 3;14 void fun()15 {16 t += 100;17 cout << "hhh" << t << endl;18 }

 

 输出为

这是因为int t = 3 这句的作用域已经包含了fun()函数了。

 

  • 将外部变量的作用域拓展到其它文件

当你想在一个工程里用多个文件来写整个大程序,那么你在一个文件里定义了一个全局变量(外部变量), 不作声明的话,另一个文件是找不到这个变量的, 不像写在一个文件里那么简单。

这时就可以用extern来搞事了。其实这一点完全可以类比上一个作用,也就是说明extern不仅可以在一个文件里扩展作用域,在整个工程里都是可以的。

栗子:

//main.c文件  1 #include 
2 3 using namespace std; 4 void fun(); 5 6 int t; 7 int main() 8 { 9 t = 1;10 fun();11 cout << "t=" << t << endl;12 }
//另一个.c文件 1 #include 
2 3 using namespace std;4 5 extern int t;6 void fun()7 {8 t += 100;9 }

输出

 

有必要说明一下,extern声明的必须得是外部变量,即定义在函数外面的变量, 要是你把第一个点的程序里面int t 写在子函数内部, 就会报错。第二点的也不能写在子函数里面。

 /***************************分割线***********************/

static的用法

  • 阻止extern来扩展作用域

比如上面第一点中如果在int t 的前面加上static,那么extern不起作用了,就会报错。第二点也是这样。通常一个大工程会分给好多人一起写,如果一个人确定自己这个文件里的这个变量不会被其它文件使用,又不想被其它文件误用, 就加个static,起到隔离的作用。

  • 使某个局部变量在函数调用结束后保留原值

我们知道在一个函数里定义的变量,会在函数调用结束后被抹去,就像做梦一样,什么都没了。但是如果在函数里的某个变量前加一个static, 它的值就不会消失,好比你下次做梦还能接着上次的做。。。

举个栗子

1 #include 
2 3 using namespace std; 4 void fun(); 5 6 int main() 7 { 8 fun(); 9 fun();10 fun();11 }12 13 void fun()14 {15 static int t = 1;16 t++;17 cout << t << endl;18 }

输出

如果没有static,就会输出3个2。

也就是说static int t = 1; 这句话只会执行一遍,即初始化t 只有一遍。之后再到这里,它会直接跳过。

 

但是有人会说,这个不就和写一个大全局变量的用法重复了吗。确实,如果你在main函数前面直接定义一个全局变量int t; 实现效果是一样的

代码为

1 #include 
2 3 using namespace std; 4 void fun(); 5 int t = 1; 6 int main() 7 { 8 fun(); 9 fun();10 fun();11 }12 13 void fun()14 {15 t++;16 cout<< t << endl;17 }

输出一样。

 

但是,两种做法其实并不一样,要是用static来写,那么只是把t 的生存期变长了,作用域并不会改变。也就是说,t 这个变量虽然在函数调用结束后,其值并不会消失,但是并不能在函数外面使用它。

它只能在函数里产生作用,在函数外面根本不知道有这个东西,甚至也可以定义一个t 的变量,而且并不会产生冲突。好比说,你梦里面干的事只能在你梦里干,就算你每次做梦都接着上次的做,然而现实生活中别人是不知道你做了啥梦。

栗子

1 #include 
2 3 using namespace std; 4 void fun(); 5 6 int main() 7 { 8 int t = 100; 9 fun();10 cout << t << endl;11 fun();12 t++;13 fun();14 cout << t << endl;15 }16 17 void fun()18 {19 static int t = 1;20 t++;21 cout<< t << endl;22 }

输出为

此时就像正常没有static 来处理t 一样,二者不会产生冲突。很神奇。

 

在自己瞎搞的过程中,我还发现一个现象。当你把刚刚那个代码中main 函数里的 int t = 100; 拿到main 函数外面,当成全局变量, 输出是一样的。

不仅如此,你把它写成全局变量后,即使再把子函数里的static去掉, 输出还是一样的。

这就说明了,一个大全局变量遇到子函数里定义的长得一样的小变量,大全局变量并不会影响小变量,读者可以自己试试。

我想可以这样理解这种情况,当你定义了一个大全局变量后,全局都可以使用,但是要是你在子函数中(不是main函数)也定义了一个相同的变量,无论你是否用static,子函数就按子函数定义的来搞,子函数结束,并不会影响你的大全局变量。

 

转载于:https://www.cnblogs.com/yongy1030/p/7359009.html

你可能感兴趣的文章
宿舍局域网的应用
查看>>
html代码究竟什么用途
查看>>
oracle的substr函数的用法
查看>>
QT 数据库编程四
查看>>
npm下载包时代理配置
查看>>
全球十大理论
查看>>
model.addAttribute("student",student)——渲染
查看>>
JavaWeb开发之普通图片验证码生成技术与算术表达式验证码生成技术
查看>>
python和pywin32实现窗口查找、遍历和点击
查看>>
第二章 概率图模型的基本原理
查看>>
Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)
查看>>
Nginx反向代理,负载均衡,redis session共享,keepalived高可用
查看>>
CentOS7 yum 安装git
查看>>
sublime text 3浅色主题
查看>>
数据结构之红黑树(三)——删除操作
查看>>
html5视频标签
查看>>
JAVA进阶-注解
查看>>
三元表达式之理解/jquery源代码分析之$.inArray实现
查看>>
STM32 mdk软件仿真时过不去时钟的问题
查看>>
(转)让Spring自动扫描和管理Bean
查看>>