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修饰变量 它具有静态存储持续时间.块范围和无链接. 即作用域只能在块中,无法被块外的程序调用:变量在程序加载时创建,在程序终止时结束. 它只在编译时初始 ...
随机推荐
- hadoop2.6.0中自定义分割符
最近在学习hadoop,用的hadoop2.6.0 然后在学习编写mapreduce程序时,发现默认对文件的输入是采用每行进行分割,下面来分析下改变这个分割方式的办法: 来看看默认是怎样实现的:
- [转]对 td 使用 overflow:hidden; 无效的几点错误认识
转载:http://www.cftea.com/c/2010/12/UVBUCD0J888L2XPQ.asp 一.是 td 的原因. 其实这关 td 什么事呢?div 也是一样的,看示例: <d ...
- [hdu4311]Meeting point-1
题意:在整数坐标轴上找一个距离所有给定点距离最小的点. 解题关键:对x和y分别处理,前缀和预处理所有点到最小点的距离,每点的$sum$等于左边的贡献+右边的贡献,最后取$min$即可. 复杂度:$O( ...
- WPF PasswordBox鼠标进入时程序异常退出的解决办法
最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...
- 连接带密码的access数据库
在网上找了很多都不靠谱,稀里哗啦的弄一堆连接字符串,很不优雅. 这个方法很简单: 1.在“连接”这页中,下方有“输入登录数据库的信息”用户名:admin,并在下面选择“空白密码” 2.在“所有”这页的 ...
- HDU 3572 Task Schedule (最大流)
C - Task Schedule Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- MFC——4个基本类中的成员函数介绍
09121852 杜军 机械设计及理论 1. CMainFrame ActivateFrame使框架对用户可视并可用 CalcWindowRect每当主框架窗口的客户区尺寸发生变化或控制条的位置发生变 ...
- Python服务Debian打包新思路
此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Debian 打包一直是比较冷僻的技术,大部分同学都不会接触到它. 但是我们 Debian 服务器上安装的各 ...
- 模板 - 动态规划 - 数位dp
#include<bits/stdc++.h> using namespace std; #define ll long long ]; ll dp[][/*可能需要的状态2*/];//不 ...
- 脚本执行JavaScript代码
下面是一个具体的demo测试脚本引擎,执行javas文件. package Rhino; import java.io.FileReader;import java.net.URL; import j ...