首页 > 其他 > 详细

版本迭代中的软件工程思想

时间:2020-11-10 23:13:05      阅读:33      评论:0      收藏:0      [点我收藏+]

本文重点包含以下内容:

1.Linux + VS Code编程环境配置(tasks.json / launch.json / c_cpp_properties.json / Makefile)

2.代码中的软件工程思想(模块化设计,可重用接口与线程安全)

 

一、编译和调试环境配置

本文基于C语言编写的menu菜单命令程序,所用到的工具及环境如下: 

关于上述工具的安装和使用,超链接和网上的资料中有非常详尽的文档,此处不再赘述。

在使用VS Code进行C/C++的开发过程中,有三个至关重要的配置文件,分别是 tasks.json, launch.json 和 c_cpp_properties.json;

此外,在Linux环境编程时Makefile文件进行自动化部署,有助于提升程序的可移植性和易用性。

 

1. tasks.json

tasks.json是在vscode中辅助程序编译的模块,可以代你执行类似于在命令行输入gcc hello.c -o hello”命令的操作,你只要在图形界面下操作即可生成可执行文件。

当你在项目文件夹下打开vscode后,选择“终端”,选择“配置任务”,选择你想使用的编译器(这里本人选择gcc),即可生成默认的tasks.json文件。

技术分享图片

可以看到在文件夹下生成了名为.vscode的文件,tasks.json就放在其中。

其中比较重要的几个变量:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",        //任务类型,默认即可
            "label": "环境配置测试",     //任务的名称,可以修改,但一定要和launch中的"preLaunchTask"项保持一致
            "command": "/usr/bin/gcc",    //编译器的路径
            "args": [                    //编译时使用的参数,和命令行下相同
                "-g",
                "${fileDirname}/hello.c",
                "-o",
                "${fileDirname}/hello"
            ],
            //上述内容相当于在命令行下输入了: gcc hello.c -o hello
            "options": {
                "cwd": "/usr/bin"    //编译器的目录
            },
            "problemMatcher": [
                "$gcc"        //使用gcc捕捉错误
            ],
            "group": "build",
            "detail": "compiler: /usr/bin/gcc"        //一些描述性信息
        }
    ]
}

 

2. launch.json

launch.json是用于运行 (run) 和调试 (debug) 的配置文件,可以指定语言环境,指定调试类型等等内容。

打开VS Code后,按照下图所示的提示,从左向右依次点击(也可以在上方菜单栏依次选择“运行”“打开配置”,选择"C++ (GDB/LLDB) "即可生成launch.json),创建launch.json文件

技术分享图片

生成的launch.json也放在.vscode文件夹中

其中各种变量的内容及涵义如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "运行和调试",       //运行和调试任务的名称,可自定义
            "type": "cppdbg",       //配置类型,默认即可
            "request": "launch",    //launch模式允许我们打断点进行调试,默认即可
            "program": "${fileDirname}/hello",      //程序目录,这里相当于"./hello"
            "args": [],             //程序(main函数)的入口参数
            "stopAtEntry": false,       //在入口处暂停,选true相当于在入口处增加断点
            "cwd": "${workspaceFolder}",    //当前的文件目录
            "environment": [],          //添加到程序的环境变量
            "externalConsole": false,   //外部控制台,true在调试时会开启系统控制台窗口,false会使用vscode自带的调试控制台
            "MIMode": "gdb",        //使用gdb进行调试
            "setupCommands": [      //用来设置gdb的参数,默认即可
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "环境配置测试",    //运行和调试前要执行的task(编译)任务,名称要对应上task.json里的"label"任务名
            "miDebuggerPath": "/usr/bin/gdb"    //debug调试工具的路径,这里使用gdb所在的路径
        }
    ]

也可以参考 Configuring C/C++ debugging官方文档Debugging in VS Code官方文档 进行设置

 

3. c_cpp_properties.json

c_cpp_properties.json主要用来设置包含头文件的路径,设置C/C++支持的版本号等等。

点击Ctrl + Shift +P 弹出命令搜索框,选择C/C++: 编辑配置 (UI) 即可生成c_cpp_properties.json文件,此文件同样包含在.vscode文件夹中。

技术分享图片

其中主要的变量名称和涵义如下:

{
    "configurations": [
        {
            "name": "Linux",    //配置名称,默认为系统名,可以自行更改
            "includePath": [    //运行项目包含.h头文件的目录,
                "${workspaceFolder}/**"//此处会匹配工作文件下的所有文件
            ],                  //添加"compilerPath"后,系统include路径可不写明
            "defines": [],
            "compilerPath": "/usr/bin/gcc",     //编译器的路径
            "cStandard": "gnu17",               //C标准的版本
            "cppStandard": "gnu++14",           //C++标准的版本
            "intelliSenseMode": "gcc-x64"       //IntelliSense的一些配置,默认即可
        }
    ],
    "version": 4
}

也可参考 c_cpp_properties.json 官方文档 设置更多内容。

 

在上述三个配置文件中,我们会看到类似于 ${workspaceFolder} 等等类似的描述,这些描述是VS Code预定义变量名,可以用来代指工作目录的路径,环境变量的名称,生成文件的名称等等。使用这些预定义的变量名可以使得我们的开发过程更加高效,同时可移植性也大大增强。更多内容可以参照官方文档 Variables Reference

一般我们比较常见的变量名有:
${workspaceFolder} - VS Code当前打开工作区文件夹的路径
${file} - 当前打开文件的绝对路径
${fileBasename} - 当前打开文件的名称
${fileBasenameNoExtension} - 当前打开文件的名称,但是不加后缀名
${fileDirname} - 文件所在的文件夹路径

 

4. Makefile

如果不使用VS Code运行编译,我们还可以使用Makefile文件来管理项目的编译。Makefile文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目。一旦写编写好 Makefile 文件,只需要一个make命令,整个工程就开始自动编译,不再需要手动执行GCC命令。

Makefile是如何工作的呢?Makefile的基本结构如下:

target... : prerequisites ...

  command

.............

 

target是目标文件,可以是.o文件,可执行文件,还可以是一个标签(伪目标,如all / clean等);

prerequisites是要生成target文件所依赖的文件或是目标;

command是make需要执行的shell命令,需另起一行并包含一个制表符<TAB>;

基本规则是这样的:一般情况下,在命令行输入make时,程序会自动检测目录下的Makefile文件,将第一个target作为最终的目标文件,依次检测target和prerequisites的依赖关系,判断prerequisites文件的修改时间,若晚于target修改,make就会执行command命令。

以menu实验lab7.2的Makefile为例:

 1 CC_PTHREAD_FLAGS             = -lpthread
 2 CC_FLAGS                     = -c 
 3 CC_OUTPUT_FLAGS                 = -o
 4 CC                           = gcc
 5 RM                           = rm
 6 RM_FLAGS                     = -f
 7 
 8 TARGET  =   test
 9 OBJS    =   linktable.o  menu.o test.o
10 
11 all:    $(OBJS)
12     $(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS)
13 
14 .c.o:
15     $(CC) $(CC_FLAGS) $<
16 
17 clean:
18     $(RM) $(RM_FLAGS)  $(OBJS) $(TARGET) *.bak

 

1~9行定义了一些变量名,类似于C语言中的宏定义。

我们首先在命令行输入make clean(这里的"clean"就是一个伪目标,并且不含prerequisites,make就不会自动去找它的依赖文件,也不会执行它后面的shell命令。因此,要执行clean就需要显式的指出make clean),make会执行第18行命令 $(RM) $(RM_FLAGS) $(OBJS) $(TARGET) *.bak 这样一个命令,即删除所有的中间文件及可执行文件,使得项目回到初始的纯净状态。

当我们输入make命令时,make会首先找到第一个目标“all”,$(OBJS)包含的.o文件并没有生成,此时,14/15行代码的命令执行,找到对应的.c文件,从而生成$(OBJS)中的.o文件,进而执行第12行命令 $(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS) 生成名为task的可执行文件。

作为工程源码的一部分,Makefile也要经常进行维护,在编写时也有很多技巧。良好的Makefile文件可以增加程序的可移植性,提升抽象程度和易用性。

更多关于Makefile的规则和用法,可以参照ubuntu官方wiki文档:跟我一起写Makefile

 

二、代码中的软件工程思想

lab1

使用伪代码构建了menu程序的雏形,不断迭代增加内容,便于及时发现问题;

 

lab2

完成了伪代码的简单实现,加入注释(整体信息和修订记录);

 

lab3.1

引入了函数和宏定义,引入了tDataNode简化代码;

 

lab3.2

将tDataNode进行封装;

 

lab3.3

将数据结构从主文件分离,一个C文件和一个头文件;

 

lab4

引入了LinkTable数据结构;

 

lab5.1

引入了Callback方式的接口;

 

lab5.2

引入了Makefile文件;

 

lab7.1

将接口定义在.h文件中;

 

lab7.2

增加了readme文件引导用户运行程序;

版本迭代中的软件工程思想

原文:https://www.cnblogs.com/harrypotterisdead/p/13955293.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!