从五个点来说
1.p3.h 中 静态定义一个const的int 变量并且赋值
2.p5.h 声明函数test2的定义
3. 直接extern 引用声明 test1() 函数 而不是像p5.h一样 把函数声明写到头文件 在别的.c文件直接包含头文件 第二点和第三点 是引用声明函数的两种用法
4.main函数 中static静态定义一个const变量num,然后在p1.c也是这样定义一个同名变量,这个是为了说明内部链接,在main函数中和p1.c中,这两个变量num是分别存在内存中,如果qt这样写,就会报错
5.外部引用声明一个int的externnum变量,而这个externnum的变量是在p2.c中声明并且定义为30的,这个做法是和把变量写在头文件然后别的.c文件包含头文件去使用这个变量
p1.c
p2. c
p3.h
p4.c
p5.h
a.out
一言以蔽之:
函数 :可以通过extern 和包含对应函数定义的头文件来使用它
变量:可以通过extern 和包含对应变量定义的头文件来使用它
static const int num = 10: 一个.c文件 中这样写,是内部链接,是在这个.c文件自己独立给这个num分了内存,其他的.c文件是不能访问到这个num的,不会有报错(c primer plus书上346页 回去拍个照 贴上来)
这样在qt里面写,也是行的,qt在.c文件(不是.h文件) 写static const int num = 10,是整个程序这给这个num开一个内存,是也会给每个.c文件分属于这个num独立的内存的。
但是如果static const int num = 10写在.h,然后一个.c文件包含这个.h文件,然后又在这个.c文件又定义一个static const int num = 10,就会报错说是重定义。(其实也是很好理解了,包含了头文件就相当于引用声明了num,再一次自己定义声明num,就肯定会报重定义)