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声明和定义同处一个文件,其实这是编程习惯问题,需要克服。