本文主要介绍模块化程序设计(多文件编程)的相关知识。

1 概述

模块化程序设计是指在进行程序设计时,将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个特定的功能,然后在这些小程序模块之间建立必要的联系,通过这些小程序模块的互相协作,完成整个大程序功能的程序设计方法。

这里需要说明的是,模块化程序设计(开发)并非专指多文件编程,模块化程序设计(开发)的重点在于小功能模块的设计和协作,多文件编程只是将(一个或多个)“小程序模块”打包在单独的文件中,以文件的形式进行呈现,形成了多文件编程形式。

本文重点介绍多文件编程的方法。

2 多文件编程的方法

本文介绍两种多文件编程的方法,示例程序架构是:主函数中调用 fileA.cpp 中定义的函数 funA() 和 fileB.cpp 中定义的函数 funB()。

此处给出一个简单的示例,相关的示例代码如下。

文件 fileA.h 内容如下:

#include <iostream>using namespace std;int funA();

文件 fileA.cpp 内容如下:

#include "fileA.h"int funA()
{cout << "This is funA in fileA.cpp print out!" << endl;return 0;
}

文件 fileB.h 内容如下:

#include <iostream>using namespace std;int funB();

文件 fileB.cpp 内容如下:

#include "fileB.h"int funB()
{cout << "This is funB in fileB.cpp print out!" << endl;return 0;
}

文件 main.cpp 内容如下:

#include "fileA.h"
#include "fileB.h"int main()
{// 调用函数funA,函数funA在fileA.cpp中进行定义funA();// 调用函数funB,函数funA在fileA.cpp中进行定义funB();return 0;
}

2.1 方法1:直接编译包含模块功能的c/cpp文件

此方法中,主函数文件与功能模块(函数)文件之间的调用关系如下图所示:

对于示例代码文件,进行多文件编程,编译命令如下:

g++ -o main main.cpp fileA.cpp fileB.cpp

运行编译生成的 main 程序,结果如下:

总结:本方法通过在编译时直接包含 cpp 文件的形式,将主函数与相关的模块连接在了一起,在主函数中成功调用了函数 funA() 和函数 funB(),实现了模块间的协作。

2.2 方法2:使用共享库

此方法中,主函数文件与功能模块(函数)文件之间的调用关系如下图:

在使用共享库的场景下,需要先编译生成功能模块的共享库,编译命令如下:

g++ -shared -fPIC -o libfileA.so fileA.cpp
g++ -shared -fPIC -o libfileB.so fileB.cpp

运行上述编译命令后,会生成两个共享库:libfileA.so 和 libfileB.so。

在编译过程中,通过关联共享库,建立主函数与相应功能模块的关联关系,编译命令如下:

g++ -o main main.cpp -L . -lfileA -lfileB

说明:“-L”选项指定了共享库的位置;“-l”选项指定了共享库的名字。在运行生成的 main 程序之前,还需要指定程序运行时需要的共享库的路径(有多种方法可以使用,例如设置环境变量 LD_LIBRARY_PATH 的值)。

运行编译生成的 main 程序,结果如下:

总结:本方法通过在编译时连接共享库的形式,将主函数与相关的模块连接在了一起,在程序运行时,再根据设置的共享库的路径(例如设置环境变量 LD_LIBRARY_PATH 的值),去寻找 funA() 与 funB() 的具体定义,最终实现了模块间的协作。


说明:在实际的软件开发过程中,很多情况下都会使用“方法2(共享库)”进行模块化程序开发。使用共享库有如下优点:

  • 共享库的函数在编译的时候并没有被编译进目标代码中,所以编译生成的程序不会太大;
  • 共享库是独立于应用程序存在的,因此,用新版本的共享库替旧版本的共享库时,工作变得非常简单;
  • 在软件开发过程中,厂商通常只提供头文件(.h)和共享库(.so)供开发者使用,这样开发者能够调用头文件中提供的接口,使用相应的功能,但是却看不见模块功能的源码信息,最终实现了在提供模块功能的同时又保证了模块封装性的目的。

模块化程序设计(多文件编程)介绍相关推荐

  1. 编程思想-模块化-模块化程序设计:模块化程序设计

    ylbtech-编程思想-模块化-模块化程序设计:模块化程序设计 模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要 ...

  2. C语言模块化开发,深入多文件编程

    目录 文章目录 目录 多文件编程 项目分割 避免命名冲突 项目生成的过程 预处理 编译 汇编 链接 语言发展的过程 机器语言 汇编语言 C语言 高级语言 编译的本质 目标文件里藏着什么 可执行文件 链 ...

  3. linux文件编程(2)——系统文件描述符、动静态文件、块设备介绍

    参考:linux文件编程(2)--文件操作原理简述之文件描述符.动静态文件.块设备 作者:丶PURSUING 发布时间: 2021-04-09 11:14:12 网址:https://blog.csd ...

  4. 新手必看的编程介绍,帮你推荐学习方案!

    新手必看的编程介绍,帮你推荐学习方案! VB是什么? ) y0 {6 G# G; j3 B VB 是Visual Basic编程语言 * B. O2 G# z) O1 |- g8 `4 ^ 编写计算机 ...

  5. Visual C# 资源文件编程--创建资源文件

    资源文件顾名思义就是存放资源的文件.资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用.同时在程序设计的时候,有时出于安全或者其他方面因素的考虑,把重要东西存放在 ...

  6. java程序设计之网络编程基础教程_Java程序设计之网络编程基础教程

    基本信息 书名:Java程序设计之网络编程基础教程(21世纪高等学校计算机基础实用规划教材) :43.50元 作者:李芝兴 主编 出版社:清华大学出版社 出版日期:2012-12-1 ISBN:978 ...

  7. 函数与模块化程序设计

    目录 函数的分类 标准库函数 自定义函数 函数的定义 自定义函数格式 函数调用 二分查找 函数原型与声明 变量的作用域和生存期 变量的作用域 全局变量与局部变量 变量的生存期 自动变量 静态变量 外部 ...

  8. 第7章 Linux下的文件编程(一)

    很久没有发文章了,这次把Linux系统下的文件编程整理了一下,太久不写的话,人会变懒的所以还是得坚持哈. Linux下的文件编程 第7章 Linux下的文件编程(一) 7.1 概述 7.1.1 Lin ...

  9. C++面向对象编程介绍

    1 面向对象编程介绍 例如,开发一个单片机程序,要求读取串口的数据.那么,就可以使用C语言编写一个串口数据读取的函数,在串口中断函数中触发,读取寄存器的地址即可.对于这样的操作,使用C语言来编写就足够 ...

  10. linux应用程序接收文件,Linux应用程序学习之文件编程

    Linux应用程序学习之文件系统调用函数编程 上一篇我们了解了Linux系统下函数库的设计方法,这一章我们就来学习一下linux系统下常用的文件操作函数,在进行系统文件操作函数介绍前,我们首先要明白一 ...

最新文章

  1. c++ STL 常用容器元素类型相关限制 指针 引用
  2. [Reprint] 探寻C++最快的读取文件的方案
  3. Android adt 初步理解和分析(三)
  4. Java 基础【09】你的多继承纳?
  5. beautiful sentences
  6. Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step(二)
  7. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)
  8. 小红书推荐大数据在阿里云上的实践
  9. 一个大数据量表访问优化--联动下拉框查询优化
  10. 解析6种常用View 的滑动方法
  11. java web 基础知识 流程图
  12. ROS学习(9)自定义移动机器人模型Gazebo仿真
  13. 【程序人生】上海,想说爱你不容易
  14. Netlink的简介及使用方法
  15. 谷粒商城--SPU和SKU(属性分组、规格参数、销售属性)
  16. windows下创建python虚拟环境
  17. 黑客攻防从入门到精通(一)
  18. word排版技巧:这几种特殊版式轻松搞定
  19. 美国联邦和州监管机构提起反垄断诉讼,要求拆分Facebook
  20. YOLO系列标注文件txt标签类别索引批量修改脚本

热门文章

  1. 6月28日云栖精选夜读丨优酷世界杯的好后卫:云计算成为靠谱的流媒体保障体系...
  2. 第二周Python笔记 数据类型 字典
  3. Android图片控件,跟随列表(recyclerView)的上下滚动而同步平移。
  4. Greenplum 模糊查询 实践
  5. PHP实现菱形与杨辉三角形【php趣味案例】
  6. 大量用户升级iPhone3.0系统导致苹果服务器故障
  7. 突破大文件上传 和内网ip的端口转发
  8. Vue之单文件组件的数据传递,axios请求数据及路由router
  9. ajax error的报错提示
  10. 关于字符编码的一点学习。