模块化程序设计(多文件编程)介绍

转自:https://blog.csdn.net/liitdar/article/details/80017744

本文介绍模块化程序设计(多文件编程)的概念及相关用法示例。

1. 概述

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

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

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

2. 多文件编程的方法

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

在这里举一个简单的示例,相关的示例代码如下:

fileA.h


    
    
    
    
  1. #include
  2. using namespace std;
  3. int funA();

fileA.cpp


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

fileB.h


    
    
    
    
  1. #include
  2. using namespace std;
  3. int funB();

fileB.cpp


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

main.cpp


    
    
    
    
  1. #include "fileA.h"
  2. #include "fileB.h"
  3. int main()
  4. {
  5. // 调用函数funA,函数funA在fileA.cpp中进行定义
  6. funA();
  7. // 调用函数funB,函数funA在fileA.cpp中进行定义
  8. funB();
  9. return 0;
  10. }

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

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

模块化程序设计(多文件编程)介绍_第1张图片

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

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

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


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

2.2 方法2:使用共享库

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

模块化程序设计(多文件编程)介绍_第2张图片

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


    
    
    
    
  1. g++ -shared -fPIC -o libfileA .so fileA .cpp
  2. 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)供开发者使用,这样开发者能够调用头文件中提供的接口,使用相应的功能,但是却看不见模块功能的具体源码,最终达到在提供模块功能的同时又保证了对模块功能的封装。

你可能感兴趣的:(linux,C++)