C/C++ 多文件(模块化编程)处理

C/C++ 多文件(模块化编程)处理

写在最前

最近接触了一个项目,需要用到多文件的处理。于是我就想着,把这些网上找来的资料整合一下,可能会有错误,恳请大家及时指出。(因为这部分我也学不太明白)
在接下来的叙述中,我们以C为例。

为什么使用模块化编程

在我们工作的时候,不可能会将所有的函数都放在一个文件下,因为你也不希望你的同事将所有的代码都放在main.c函数中。因此,我们需要利用模块的思维,将一个大功能的分为一个又一个的小功能。

从.c 和 .h讲起

我们的代码文件分为两类:.c的source和.h的header。
一般地,一个.c会对应着一个.h。
我们需要做的是,在将我们所需要实现的大功能,分解为一个又一个的小功能(模块),然后将模块们分别实现。
main实现了三个模块,这三个模块管理着不同的功能

.h

值得注意的是:C中,header(头文件)会以.h拓展名的形式存在;而C++中有可能不会。
它们应该存放的是:

  1. 函数的定义
  2. 变量的定义

事实上,在.h文件里实现函数是可以的。但是,在工程上,一般不会这样做。

.c

source(源代码)应该存放的是函数的实现。

单模块中示例

在下面的例子中,我们先定义了一个结构体mymap。
然后定义这个结构体变量citymap。
注意,这里是不用去include “mymap.c” 的。

// 宏定义
#ifndef MYMAP_H_INCLUDED
#define MYMAP_H_INCLUDED
#define MAX 100
#define CITYNAME_NAX 20

// 定义了一个结构体mymap。
typedef struct
{
    char city_name[MAX][CITYNAME_NAX];
    int now_number;
} mymap;

// 定义这个结构体变量citymap。
mymap citymap;

// 对函数的定义。
int push(char *city);
int find(char *city);
void display();
void build_map(char *file_name);

#endif // MYMAP_H_INCLUDED

而在mymap.c 中,我们需要对这个函数进行实现。
这里的实现,是我简单写了一个类似于map的操作。
大家没有必要去关注函数里具体的内容。

大家可以看到,在mymap.c文件开头中,我们需要include自己模块的头文件。然后接下来,是使用了stdio.h的静态库头文件。这里其实我是有疑问的,就是这个#include <stdio.h>应该在哪?在模块的header呢还是哪呢?希望大神可以指出呜呜呜

// include header file of module "mymap"
#include "mymap.h"
#include <stdio.h> // ?
// insert city's name into map
int push(char *city)
{
    // 无用,隐去
};

// to display the map
void display()
{

    for(int i = 0; i < citymap.now_number; i++)
        printf("%s %d\n",citymap.city_name[i],i);

    printf("%d", citymap.now_number);
}

// find the city
int find(char *city)
{
    // 无用,隐去
};

void build_map(char *file_name)
{
	// 无用,隐去
};

之后,再在main函数中,include这个模块的头文件。

#include <stdio.h>
#include "mymap.h"


int main()
{
    char energy[100] = "energy.txt";
    build_map(energy);
}

共享变量

例如,我们在module 1中定义了一个结构体。我们希望在module 2中用它。这时候,就需要共享变量。
共享的这个变量,毫无疑问,是全局变量。(因为只有全局变量才能在函数之外传递嘛)

声明和定义

声明:声明这个变量的名字,并不赋予空间;
定义:定义指出变量名字同时为变量分配存储空间,定义包含了声明。

强定义只能定义一次。局部定义的定义,属于强定义。

看例子

而例如,我们在mymap.h 中定义了一个mymap的结构体,并且定义他的变量citymap。

但是别的模块需要引用这个全局变量的话,是不能直接用的。会error,找不到这个变量的定义。因此是需要先要定义/声明这个变量。

但是,我们又不能重定义它(两次的强定义会报错)。

这时,在别的模块使用这个变量的时候,需要加上extern的关键字进行声明。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
VSCode是一款轻量级的代码编辑器,可以通过安装插件来配置C/C++环境和进行模块化编程。下面是配置C/C++环境和进行模块化编程的步骤: 1. 安装VSCode:首先,你需要下载并安装VSCode编辑器,可以从官方网站(https://code.visualstudio.com/)下载适合你操作系统的版本。 2. 安装C/C++插件:打开VSCode后,在扩展面板中搜索并安装C/C++插件。这个插件提供了C/C++语言的语法高亮、代码补全、调试等功能。 3. 配置编译器:在VSCode中,你需要配置C/C++编译器。如果你已经安装了GCC或者Clang等编译器,可以在VSCode的设置中指定编译器的路径。打开设置(File -> Preferences -> Settings),搜索"C++: Compiler Path",然后设置为你的编译器路径。 4. 创建C/C++项目:在VSCode中,你可以使用文件菜单或者命令面板(Ctrl+Shift+P)来创建一个新的C/C++项目。选择"New File"或者"New Folder"来创建一个新的文件或者文件夹。 5. 编写C/C++代码:在创建的文件中,你可以开始编写C/C++代码。VSCode提供了语法高亮、代码补全、代码格式化等功能,可以帮助你更方便地编写代码。 6. 模块化编程模块化编程是一种将程序分解为多个模块的编程方式,每个模块负责完成特定的功能。在C/C++中,你可以使用头文件和源文件来实现模块化编程。头文件(.h或.hpp)包含了函数和变量的声明,源文件(.c或.cpp)包含了函数和变量的定义和实现。 以上是配置C/C++环境和进行模块化编程的基本步骤。希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值