关于C中extern的问题

extern的含义是导入一个外部符号的声明吗? 
为什么同一个文件里面 
extern int a; 
int a = 3; 
不会出错? 

我的理解好像是extern只是表示被修饰的符号是全局的, 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
extern用于修饰变量(函数)的声明,告诉编译器这个变量(函数)的定义在当前文件以外,主要的作用就是便于编译器做参数和类型检查,就是说可以被组成一个exe文件的所有obj模块所看到。 
 
而static就是表示被修饰的符号只能被所在的obj模块看到。 

另外,extern只对于连接器有用(另外编译时可以提供 
~~~~~~~~~~~~~~~ 
不是 

语法检查,不然会有警告),而数据类型比如struct entry_t 
这个结构体数据类型只对于编译器有用, 所以数据类型 
前面是没有什么static还是extern之分的, 对吗? 
~~~~~~~~~~~~~~~~~~~~~~ 
应该说 两者没有关系 
如果没有加static, 比如 
int a = 3; 
int add() { 
        return 0; 

这两个都是extern的, 也就是都是全局可见的? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
这个两个例子是变量和函数的定义,不是声明 
extern只用于变量和函数的声明 


declare, define, 呵呵,有点晕,declare表示 
声明一个符号,define表示给这个符号赋予一个值,是吧? 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
从编译器的角度考虑,编译器会把define的代码翻译程相应的汇编代码 
而对于declare的部分,编译器应该只会做类型和参数检查吧,并没有汇编代码 

按照你的说法, extern int a表示这个变量的定义在当前 
文件以外(这是声明),那么我在同一个文件中int a = 3就是 
又声明了另一个a并定义为3,那么不是重复声明了吗? 为什么 
编译器连个警告都没有?连接也没错。 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
需要看依据编译器的处理方法了。从本质上讲,extern关键字的目的是什么呢? 
就是为了让我们在 用外部定义的 全局变量(函数)的时,显式的知编器说这个 
是已经定义的了,这样,编译器就会正常编译,不会报错。 
至于,extern声明和定义同处一个文件,其实这是编程习惯问题,需要克服。

 

 
永不止步步 发表于02-15 09:57 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:345377个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号