符号(变量)的声明和定义,从学生时代起让我搞的很头疼,一知半解的混过来了。 如果真的要区分的话,我的理解是:第一次的声明和定义,以及以后的声明和定义来区分。 声明是什么,其实声明是符号(变量)在链接时的体现,所以虽然在编译阶段也有关系,但主要的还是为了在链接阶段去用的。而定义呢,是生成了对应的程序指令。正因为有生成了机器指令,那么这个定义是实实在在的使用了。而声明只是逻辑上说明了我有这个符号产生了,编译器记录下了这个符号,但并没有产生程序机器指令。有时候,我们会把声明和定义统一的说成声明也可,这时,就要区分好。接下来,第一次的声明是编译器记录从无到有的这个符号的过程,而编译器又只是对单个文件进行编译。也就是说我们的编译后的目标文件,就可能存在符号或变量同名重叠的问题了。如果你不闻不问,那么在链接阶段就会报错了,符号或变量重定义。这种情况就会出现在外部链接的全部变量和符号上,那么就需要声明的声明,我的理解:声明的声明就是引用,用修饰符extern; extern char i; 就是一个声明的声明,代表了这个符号已在其他地方被声明过了,再次的声明只是为了能使用它。在链接阶段,链接器会将声明的声明归到最初第一次声明的位置上。所以就有了这个规则:定义只有一次,声明可以多重出现;或者说声明只有一次,而声明的声明可以多重出现。同理,对函数也一样,函数的定义产生了机器指令,而函数的第一次声明只是告诉编译器有这个符号存在,函数声明的声明就是为了告诉链接器,我和第一个函数声明定义的东西是同一个东西。 那么那个static 修饰符呢?! 只是将其的链接特性,从外部链接向内部链接转变。 |