2

Summary

1)头文件(.h)是源文件(.c)的 接口定义文件。接口指的是可被其他文件访问的函数或者数据。如果a.c中想使用b.c中定义的函数或变量,就可以通过b.h来使用,b.h中则声明了b.c中的函数和变量。

2)include中(<>)和("")的区别:
#include <header.h>,指的是在编译系统文件中查找头文件
#include "header.h",指的是先查找当前工程文件夹,再查找编译系统文件夹

3)头文件的一些规则

  • 头文件中只做函数声明变量声明(不做具体定义)
  • 头文件中可以定义数据类型(typedef,struct,union,enum)
  • 一个头文件可以对应于多个源文件(多数情况一对一
  • 不要使用#include包含源文件

4)再论全局变量:

  • 普通全局变量

    • 源文件中定义的全局变量可以在其他任意源文件中进行使用,如果其他源文件中定义了同名的全局元素,则会发生重复定义错误。(因为即使没有通过extern声明,不可直接可见,但本质各自的作用域仍然是全局的)
    • 可使用extern关键字在头文件中声明,并在其他文件中使用(如果不声明,则在其他源文件中不可见)
    • 注意,使用extern声明时的类型和变量名都必须一致,且不可以给初始值(否则就会报重复定义错误)。
  • 静态全局变量

    • static修饰的全局变量只能在当前源文件中使用
    • 无法通过extern关键字声明,也就没有办法在其他文件中使用

5)函数声明语句默认自带extern关键字修饰;类型定义必须放在头文件里,仅仅是类型声明无法创建变量。

6)static函数和static全局变量的行为是一致的。static关键字修饰函数使得函数具有文件作用域;静态函数无法在其他文件中被调用;函数设计时就需要考虑是否在其他文件中使用。

多文件程序设计

问题:实际工程开发中,所有的代码都是写在同一个文件中吗?
答:很显然不是。实际的工程开发中,通常是不同工程师或不同的团队负责不同的模块,然后各自的模块组合起来完成整个工程。

多文件编译链接:
image.png

问题:不同文件之间如何相互访问各自的程序元素?
多文件之间的相互访问:

  • 每个文件可以定义功能接口可被其他文件访问的函数或数据

    • 源文件:代码实现文件,后缀为.c
    • 头文件:源文件的接口定义文件,后缀为.h
  • 当需要使用其他文件提供的功能时,包含对应的头文件

    • 语法:

      • #include <header.h>,指的是在编译系统文件中查找头文件
      • #include "header.h",指的是先查找当前工程文件夹,再查找编译系统文件夹

再论全局变量:

  • 普通全局变量

    • 源文件中定义的全局变量可以在其他任意源文件中进行使用
    • 可使用extern关键字在头文件中声明,并在其他文件中使用(如果不声明,则在其他源文件中不可见)
  • 静态全局变量

    • static修饰的全局变量只能在当前源文件中使用
    • 无法通过extern关键字声明,也就没有办法在其他文件中使用

本文总结自“狄泰软件学院”唐佐林老师《C语言入门课程》。
如有错漏之处,恳请指正。


bryson
169 声望12 粉丝