C语言中的static和extern
c语言中,全局变量是一个非常重要的概念。全局变量定义在函数外,可以被所有的函数共同使用。
#include <iostream>
;
void display()
{
printf("%d", x);
x++;
printf("\n");
}
int main(int argc, char* argv[])
{
display();
printf("%d", x);
printf("\n");
system("pause");
}
上述例子中 int x = 10; 是对一个全局变量的定义,他的作用域是从定义的位置开始一直到文件的末尾。
当然,针对全局变量而言,我们没必要非要将他定义在文件的开始的位置,要在定义之前使用它,那么就需要声明。对比上述代码,也可以这么写:
#include <iostream>
void display()
{
extern int x;
printf("%d", x);
x++;
printf("\n");
}
extern int x;
int main(int argc, char* argv[])
{
display();
printf("%d", x);
printf("\n");
system("pause");
}
;
上例中,第一个extern int x; x的作用域是从声明开始到display函数结束,而第二个extern int x 的作用域是从声明开始到文件结束。当然,即便你重复声明一个变量也不要紧,只要声明了就可以用,而所用的x都是在下边定义的那个全局变量x。c编译的原则是可以随便多次声明但是绝不可以多次定义。
extern关键字的作用远不止单个文件这么简单。我们创建另一个源文件,只有一行代码:
;
此时我们将两个文件同时编译,果断出错了。理由很简单:x被重定义,当你使用x这个全局变量的时候,将不知道会使用哪个。即便你将声明用的extern关键字去掉也无济于事。
这就说明上述全局变量的定义是贯穿整个工程的,那么当工程庞大的时候,很有可能就会需要不同文件下有相同的全局变量名称。这个时候static关键字的作用就来了。
我们在新建的源文件定义x的时候前边加上static关键字:
;
然后编译就能通过了。因为static的作用是所在的文件中才会使用定义的全局变量。此时我们修改新文件:
#include <iostream>
extern int x;
void display2()
{
printf("%d", x);
printf("2\n");
}
;
然后我们在另一个源文件调用这个display2,因为是全局函数,所以调用前和变量一样声明一下就好了:
int main(int argc, char* argv[])
{
extern void display2();
display2();
printf("%d", x);
printf("\n");
system("pause");
}
我们发现display2打印的是20,和main所在文件中的x是两个x。
C语言中的static和extern的更多相关文章
- C语言中:static与extern对变量和函数的作用
1.两者对全局变量 static对全局变量,表示定义一个内部变量 extern对全局变量,表示声明一个外部变量 说明: 1.内部变量:定义的变量只能在本文件中访问,不能被其他文件访问. 2.不同文件中 ...
- C语言中的static的作用?
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)第一个作用:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.为理解这句话 ...
- 转:C语言中的static变量和C++静态数据成员(static member)
转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量 a.静态局部变量在函数内定义,生存期为整个程序 ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- C语言中的static 具体分析
google了近三页的关于C语言中static的内容,发现可用的信息非常少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的刚開始学习的人来说參考性不是非常大.所以,我这篇博文博採众 ...
- C语言中的static关键字
C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互 ...
- 【转载】C语言中的static 详细分析
原blog地址:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少, ...
- [整理]C语言中的static静态对象
1.说明外部对象(静态外部变量和静态函数) (1)static 用于说明外部变量或函数,使该对象的作用域限定为被编译原文件的剩余部分,即从对象说明开始到所在源文件的结束部分: (2)被st ...
- C语言中,static关键字作用
static修饰变量 1 在块中使用static修饰变量 它具有静态存储持续时间.块范围和无链接. 即作用域只能在块中,无法被块外的程序调用:变量在程序加载时创建,在程序终止时结束. 它只在编译时初始 ...
随机推荐
- ScrollView cannot scroll in Slidinguppanellayout 解决办法
xml源码如下 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:an ...
- Oracle 表连接方式(1)---
Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不加限制) 3. 自连 ...
- Python手动安装 package
https://pypi.python.org/pypi 下载 解压 进入setup.py的目录 python setup.py build python setup.py install
- Elasticsearch的前后台运行与停止(tar包方式)
备注:在生产环境中,往往一般用后台来运行.jps查看. 1.ES的前台运行 [hadoop@djt002 elasticsearch-2.4.3]$ pwd/usr/local/elasticsear ...
- CF-839A
A. Arya and Bran time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- xgene:之illumina,,ion-torrent
illumina技术: 工具:flowcell(流动池):8通道,每个通道都有 2种DNA引物 种在玻璃表面(用共价键连到Flowcell上),这引物和文库中的接头互补 Flowcell:8个l ...
- fgets(),fscanf()的输入测试与FILE中的当前指针
fgets(string,int,fp) 回车读入测试 #include <stdio.h> int main() { FILE *fp; ],ch2[],ch3[],ch4[]; fp= ...
- 【机器学习】迭代决策树GBRT(渐进梯度回归树)
一.决策树模型组合 单决策树C4.5由于功能太简单,并且非常容易出现过拟合的现象,于是引申出了许多变种决策树,就是将单决策树进行模型组合,形成多决策树,比较典型的就是迭代决策树GBRT和随机森林RF. ...
- 2018年第九届蓝桥杯国赛试题(JavaA组)
1.结果填空 (满分13分)2.结果填空 (满分39分)3.代码填空 (满分27分)4.程序设计(满分45分)5.程序设计(满分71分)6.程序设计(满分105分) 1.标题:三角形面积 已知三角形三 ...
- 过滤asp.net页面每次发出请求之前访问
public class PageFiltert : System.Web.UI.Page { public PageFiltert() { // //TODO: 在此处添加构造函数逻辑 // } p ...