【C语言基础入门】10.C语言中的多文件程序设计

文章目录

一、多文件与编译器链接

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

三、关于#include

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

五、再论全局变量

六、注意事项

七、实验程序

八、小结


一、多文件与编译器链接

如下图所示,.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 关键字修饰的全局变量不能在其它文件中使用
     
  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风自在 流水潺潺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值