u8国际,u8国际官方网站,u8国际网站最新,u8国际网站,u8国际网址,u8国际链接
但随之有一个小问题,在例程-5中,我们并没有用extern标志符来修饰play1啊,这里涉及到另一个问题, C语言中有默认的存储类标志符.C99中规定,所有顶层的默认存储类标志符都是extern .原来如此啊,哈哈.回想一下例程-4,也是好险,我们在无知的情况下,竟然也误打误撞,用到了extern修饰符,否则在first.h中声明的play1函数如果不被连接程序导出,那么我们在在play2()中调用他时,是找不到其实际定义位置的.
我们在这里只讲述与.h文件相关的顶层作用域,顶层作用域就是从声明点延伸到源程序文本结束,就printStr()这个函数来说,他没有单独的声明,只有定义,那么就从他定义的行开始,到first.c文件结束,也就是说,在在例程-2的main()函数的引用点上,已经是他的作用域.例程-3的main()函数的引用点上,还不是他的作用域,所以会编译出错.这种情况怎么办呢?有两种方法,一个就是让我们回到例程-2,顺序对我们来说没什么,谁先谁后不一样呢,只要能编译通过,程序能运行,就让main()文件总是放到最后吧.那就让我们来看另一个例程,让我们看看这个方法是不是在任何时候都会起作用.
在大型项目中,对全局变量的使用不可避免,比如,在first.c中需要使用一个全局变量G_test,那么我们可以在first.h中,定义TPYE G_test.与对函数的使用类似,在second.c中我们的开发人员发现他也需要使用这个全局变量,而且要与first.c中一样的那个,如何处理?对,我们可以仿照函数中的处理方法,在second.h中再次声明TPYE G_test,根据extern的用法,以及c语言中默认的存储类型,在两个头文件中声明的TPYE G_test,其实其存储类型都是extern,也就是说不必我们操心,连接程序会帮助我们处理一切.但我们又如何区分全局变量哪个是定义声明,哪个是引用声明呢?这个比函数要复杂一些,一般在C语言中有如下几种模型来区分:
C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐认识清楚他的本来面目。揪其原因,我的驽钝和好学而不求甚解固然是原因之一,但另外还有其他原因。原因一:对于较小的项目,其作用不易被充分开发,换句话说就是即使不知道他的详细使用方法,项目照样进行,程序在计算机上照样跑。原因二:现在的各种C语言书籍都是只对C语言的语法进行详细的不能再详细的说明,但对于整个程序的文件组织构架却只字不提,找了好几本比较著名的C语言著作,却没有一个把.h文件的用法写的比较透彻的。下面我就斗胆提笔,来按照我对.h的认识思路,向大家介绍一下。
@HASHKFK