说一下C语言的存储类说明符:
1.Auto 只在块内变量声明中被允许,表示变量具有本地生存期。
2.Extern 出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存期,连接程序知道其名字。
3.Static 可以放在函数与变量声明中。在函数定义时, 其只用于指定函数名,而不将函数导出到连接程序。在函数声明中,表示其后面会有定义声明的函数,存储类为static。在数据声明中, 总是表示定义的声明不导出到连接程序。
说明:C99中规定, 所有顶层的默认存储类标志符都是extern
1.函数声明
我们如何来区分哪个头文件中的函数声明在其对应的。c文件中有定义,而哪个又没有呢?这不是必须的,因为无论在哪个文件中定义,聪明的连接程序都会义无返顾的帮我们找到,并导出到连接程序,但我觉得他确实必要的。 因为我们需要知道这个函数的具体内容是什么,有什么功能, 有了新需求后我也许要修改他, 我需要在短时间内能找到这个函数的定义。
那么我来介绍一下在C语言中一个人为的规范:在.h文件中声明的函数,如果在其对应的.c文件中有定义,那么我们在声明这个函数时,不使用extern修饰符, 如果反之,则必须显示使用extern修饰符。这样,在C语言的.h文件中,我们会看到两种类型的函数声明。 带extern的,还不带extern的, 简单明了,一个是引用外部函数,一个是自己声明并定义的函数。
2.全局变量的声明与定义
打开我们项目的一个.h文件我们发现除了函数外,还有其他的东西, 那就是全局变量。在大型项目中,对全局变量的使用不可避免。比如,在first.c中需要使用一个全局变量Gtest, 那么我们可以在first.h中,定义 TPYE Gtest。与对函数的使用类似, 在second.c中我们的开发人员发现他也需要使用这个全局变量,而且要与first.c中一样的那个, 如何处理? 我们可以仿照函数中的处理方法,在second.h中再次声明TPYE Gtest, 根据extern的用法,以及c语言中默认的存储类型,,在两个头文件中声明的TPYE Gtest,其实其存储类型都是extern,也就是说不必我们操心, 连接程序会帮助我们处理一切。但我们又如何区分全局变量哪个是定义声明,哪个是引用声明呢?
一般在C语言中有如下几种模型来区:
1.初始化语句模型
顶层声明中,存在初始化语句是,表示这个声明是定义声明,其他声明是引用声明。C语言的所有文件之中,只能有一个定义声明。按照这个模型,我们可以在first.h中定义如下TPYE G_test=1;那么就确定在first中的是定义声明,在其他的所有声明都是引用声明。
2.省略存储类型说明
在这个模型中,所有引用声明要显示的包括存储类extern, 而每个外部变量的唯一定义声明中省略存储类说明符。