C语言多文件程序设计

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C语言多文件程序设计

清风自在 流水潺潺   2022-06-03 我要评论

一、多文件与编译器链接

如下图所示,.o 为目标文件,链接器将不同的目标文件装配组合在一起形成一个可执行文件。

二、多文件之间的相互访问

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

  • 源文件:代码实现文件,后缀为.c
  • 头文件:源文件的接口定义文件,后缀为.h

当需要使用其它文件提供的功能时,包含对应的头文件

语法:

#include <hearer.h>

#include "header.h"

三、关于#include

#include 用于声明使用其它文件的功能(头文件可看作工具包)

#include <...>

在编译系统文件中查找头文件

#include "..."

先查找当前工程文件夹,再查找编译统文件夹

四、头文件使用的一些原则

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

五、再论全局变量

普通全局变量

  • 源文件中定义的全局变量可在所有其它源文件中使用
  • 可使用 extern 关键字在头文件中进行声明,并在其它文件使用

静态全局变量

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

六、注意事项

函数声明语句默认自带 extern 关键字修饰

类型定义必须在头文件中,仅类型声明无法创建变量

静态全局变量

  • 生命期为程序运行期
  • 作用域仅在定义的文件中
  • 无法直接在其它文件中使用

static 关键字可使函数具备文件作用域(静态函数)

静态函数无法在其它文件中被调用

函数设计时需要考虑是否在其它文件中使用

七、实验程序

以CodeBlcoks为例,先建好 main.c 文件之后,点击File,New,再点击File,选择 Empty file,分别建一个 .h 和 .c 文件,完成多文件创建。

opm.h 代码:

struct Test
{
    int a;
    int b;
};
extern int g_var;   // 声明全局变量时,不需要给出初始值
extern int f_var;
int add(int a, int b);
int mul(int, int);   // 进行函数声明的时候,可以省略参数名
extern void test();

opm.c 代码:

#include <stdio.h>
int g_var = 1;
static int f_var = 2;   // 只能在当前文件中使用 ==> 静态全局变量
static void func()  // 静态函数只能在当前文件中被调用
{
    printf("void func() : f_var = %d\n", f_var);
}
void test()   // 当前文件中定义的所有函数都可以调用 func() 函数
{
    func();
}
int add(int a, int b)
{
    return a + b;
}
int mul(int a, int b)
{
    return a * b;
}

main.c 代码:

#include <stdio.h>
#include <string.h>
#include "opm.h"
int main()
{
    struct Test t = {1, 2};
    printf("a + b = %d\n", add(t.a, t.b));
    printf("a * b = %d\n", mul(t.a, t.b));
    printf("g_var = %d\n", g_var);
    // printf("f_var = %d\n", f_var);   // 无法直接使用其他文件中定义的静态全局变量
    test();
    return 0;
}

下面为输出结果:

通过这个多文件程序,说明一个问题:

static 修饰的全局变量和函数只能在当前源文件中使用,所以 func() 函数不能再 main 函数中调用,而 test() 函数可以在 main 函数中被调用。

八、小结

  • 实际工程开发中,多文件程序设计是常态
  • 源文件实现具体功能,头文件声明接口
  • #include 用于声明需要使用其它文件中定义的功能
  • extern关键字用于函数和全局变量的声明
  • static 关键字修饰的全局变量不能在其它文件中使用

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们