C语言详细分析讲解多文件的程序设计

 更新时间:2022年04月21日 10:14:27   作者:清风自在 流水潺潺  
所谓的C语言多文件编程就是,将代码实现模块化。比如说一个项目的一项功能放在一个一个文件里,然后将实现这个功能的函数放在一个c文件<BR>

一、多文件与编译器链接

如下图所示,.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 关键字修饰的全局变量不能在其它文件中使用

到此这篇关于C语言详细分析讲解多文件的程序设计的文章就介绍到这了,更多相关C语言 多文件程序设计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QT实现文件传输功能

    QT实现文件传输功能

    这篇文章主要为大家详细介绍了QT实现文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++ 成员变量的初始化顺序问题详解

    C++ 成员变量的初始化顺序问题详解

    这篇文章主要介绍了C++ 成员变量的初始化顺序问题详解的相关资料,需要的朋友可以参考下
    2017-02-02
  • 深入解析C++中的auto自动类型推导

    深入解析C++中的auto自动类型推导

    C++标准委员会在C++11标准中改变了auto关键字的语义,使它变成一个类型占位符,允许在定义变量时不必明确写出确切的类型,让编译器在编译期间根据初始值自动推导出它的类型,下面我们就来看看auto自动类型推导的推导规则吧
    2024-04-04
  • C语言经典顺序表真题演练讲解

    C语言经典顺序表真题演练讲解

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-04-04
  • C++ pair方法与vector方法案例详解

    C++ pair方法与vector方法案例详解

    这篇文章主要介绍了C++ pair方法与vector方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 浅谈c++中的stl中的map用法详解

    浅谈c++中的stl中的map用法详解

    下面小编就为大家带来一篇浅谈c++中的stl中的map用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • OpenCV实现绕图片中任意角度旋转任意角度

    OpenCV实现绕图片中任意角度旋转任意角度

    这篇文章主要为大家详细介绍了在图片不被裁剪时,opencv如何实现绕图片中任意点旋转任意角度,文中的示例代码讲解详细,需要的可以参考一下
    2022-09-09
  • 基于结构体与指针的详解

    基于结构体与指针的详解

    本篇文章是对结构体与指针进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Qt 使用Poppler实现pdf阅读器的示例代码

    Qt 使用Poppler实现pdf阅读器的示例代码

    下面小编就为大家分享一篇Qt 使用Poppler实现pdf阅读器的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 老生常谈C++getline使用方法

    老生常谈C++getline使用方法

    下面小编就为大家带来一篇老生常谈C++getline使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论