c语言高手进,深究一下extern的用法

1,在UCOS-II中,一些全局变量的声明是在UCOS-II.H中,且是用extern声明的,并且整个工程中只有这么一个地方对全局变量声明,这是不是说明多个文件中如果全部用extern声明一个变量(注意是全部文件中用extern声明),那么这个变量在所有文件中是共用的。
2,在别人编写的工程文件中我又遇见一个声明方式,用条件编译语句在一个头文件中声明一个变量即如果格式:
#ifdef _main
int a;
#else
extern int a;
#endif
在其中一个.c文件中定义_main,这种声明方式会是什么一种情况?
其实这涉及到#define的作用域,首先我们应该知道多文件编译时是有顺序的,然后生成一个目标文件,#define的作用域应该只是这一个文件而已,但是又有一点不明白了,为了我们不让头文件中的变量重复定义,我们会使用
#ifndef ####
#define ####
声明部分;
#endif
结构使其只调用一次,那么它的是在所有文件中只调用一次吗?那么#define #### 的作用域就是在#define ####之后编译的所有文件了?如何解释。

整个编译过程分编译和链接两部分。 编译是以 .c文件为一个单元的, 也就是说, 编译的时候编译器每次就只关注这一个.c文件, 编译的过程跟其它.c里写了什么毫无关系。 所以define语句不存在什么作用域的问题, 写在哪就在哪运行, 写几次就运行几次。

另外就是理解#include的意义。 每本书都会讲, #include就是把那个文件的内容替换到当前位置, 奇怪的是总有人觉得这里面有什么更神奇的东西存在。。。 #include就是替换,没有别的 。所以每个.h里面所有东西被编译器看到都是在某个 .c里面, 这时候这些语句就相当于是写在.c里的语句。

然后就可以解释你的问题。 UCOS.h里面有一个extern声明, 所以凡是include了它的.c里面就都有这么个声明, 有这个声明就是告诉编译器,某个地方有这东西, 你就用就行了。 所以就可以随便用它

但是只有extern的声明还不行, 因为毕竟这个东西需要在某个地方切实地实现它,否则编译没问题而链接是不可能过的。 所以就需要在某个.c里写上它的实现。 为了简单点完成这个而写了#ifdef之类的东西, 就是想在定义了 _main的情况下写它的实现, 而没定义这个的情况下变成它的声明。
温馨提示:答案为网友推荐,仅供参考
相似回答