C语言(7) 模块化编程及多文件开发注意事项

C语言第五章:C语言的模块化编程 第一节 模块化编程(多文件开发):就是多文件(.c文件)编程,一个 .c 文件和一个 .h 文件可以被称为一个模块。 多文件开发的源程序是:? .c C语言的源文件 .h (header头文件) 1)、方法的声明 但是不能实现方法 2)、声明变量(声明 .h文件 实现.c文件) 3)、声明 阅读详情

模块化编程

好处

隐藏源文件用的时候只需要包含.h文件

团队的分工协作

可以把功能分为若干个模块


实现

.h文件 声明文件(可以把C所有的声音函数的方法写到这个里面)

声明函数

声明变量

声明结构体

.c文件 源文件



多文件开发注意事项

1.头文件可以和C程序一样引用其它文件,可以写到预处理块,但不要写具体语句

2、可以声明函数,不可以定义函数

3、可以声明变量、不可以定义变量

4、可以定义一个宏函数。宏函数很像函数,但只有声明,不是一个真正的函数

5、结构的定义、自定义数据类型一般放在头文件中

6、多文件编程只能有一个main函数入口,因为一个工程只能有一个入口函数,把包含main函数的文件称为主文件夹

7、 一般一个.h文件对应一个.c文件,并且文件名称要相同

8、头文件要遵循幂等原则,可以包含多个 同的头文件,但只有一个生效

9、防止重复包含的措施

51单片机入门教程——模块化编程(新手版) 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡。目录前言1.知识储备1.传统方式编程与模块化编程区别2.模块化编程框图3.模块化编程注意事项4.C预编译2.操作流程1.调试Keil uVision5,正常显示汉字2.代码模块化3.主体代码编写4.进行烧录3.代码解析5-1 模块化编程中的代码5-2 LCD1602调试工具中的代码4.总结。 阅读详情

相关推荐

嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用

本文介绍了嵌入式C语言中多文件编程的实现方法,通过"打印个人信息"实例详细演示了操作流程。关键步骤包括:1) 创建功能模块的.c和.h文件;2) 将.c文件添加到工程;3) 通过头文件调用函数。重点说明了.h文件的宏保护机制、路径管理规范,以及三目运算符的简洁用法。这种模块化编程方式能有效提升代码可维护性,是嵌入式项目开发的基础技能。文章还预告了下期将讲解函数指针的使用技巧。

2502_90552706的博客 1142

C语言之用函数实现模块化程序设计

七、C语言之用函数实现模块化程序设计

littleprince009的博客 1370

基于C语言控制台程序的简易MP3音乐播放器

这是我们小学期的第一个大作业,因感受颇深,特此写下这篇博客留作纪念。 内容:设计一个带有播放控制和音量调节功能的控制台音乐播放器,其中播放控制的子菜单能实现播放暂停切换、停止当前曲、播放上一曲和下一曲的功能。在进入主菜单前能遍历工程文件内所有文件夹并在屏幕上显示所有mp3扩展名的音乐文件。 查阅相关资料: 1.sprintf(wsprintf 函数的使用) (1)spri

xiaoye_dlut的博客 2万+

如何进行模块化编程和头文件的使用?

模块化编程是一种将程序分解成多个独立模块或功能单元的方法,每个模块负责特定的任务或功能。这些模块可以独立开发、测试、维护和重用,从而简化了整个程序的开发过程。可维护性(Maintainability):将程序分解成模块,使得在需要修改或扩展程序时,只需要关注特定模块,而不需要触及整个程序。可重用性(Reusability):每个模块都可以在不同的程序中重复使用,从而减少了代码的重复编写,提高了效率。可测试性(Testability)

weixin_68551689的博客 596

C语言中的多文件编程

math.h// math.h// 函数声明#endif说明#ifndef和#define是条件编译指令,用于防止头文件重复包含(即防止多重包含)。add和subtract是声明的两个函数,它们将被实现放在对应的源文件中。C语言的多文件编程是为了将代码拆分成多个模块,以提高程序的可维护性和可扩展性。通过合理的组织头文件和源文件,程序员可以实现代码的模块化,并在不同的源文件之间共享接口。多文件编程使得大项目的开发变得更加高效,并且能够避免一个文件中代码过于庞大的问题。

m0_62599305的博客 998

基础篇.ARM架构介绍(1)

ARM公司主要向客户提供处理器IP。ARM体系结构是一种硬件规范,主要用来约定指令集、芯片内部体系结构等。以指令集为例,ARM体系结构并没规定每一条指令在硬件IP中如何实现,只是约定了每条指令的格式、行为规范、参数等。

heshuangzong的博客 7803

转载 关于模块化工程注意事项

开场白: 很多人也把多文件编辑称 作模块化编程,其实我觉得叫多文件编程会更加符合实际一些。多文件编程有两个最大的好处,一个是给我们的程序增加了目录,方便我们查找。另外一个好处是方 便移植别人已经做好的功能程序模块,利用这个特点,特别适合团队一起做大型项目。很多初学者刚开始学多文件编程时,会经常遇到重复定义等问题,想知道怎么 解决这些问题吗?只要按照以下鸿哥教的规则来做,这些问题就不存在了。 第...

weixin_30722589的博客 183

踩坑记录:Clawdbot 对接 Minimax 报错 “401 token is unusable (1004)“ 的终极解决方案

如果你也在配置 Clawdbot 对接 Minimax 模型时,明明 API Key 是新申请的,却死活报错 `401 Unauthorized`,错误码 `1004`,提示 `token is unusable`——那么恭喜你,来对地方了。

hampeter的博客 2001

菜鸟攻略——C语言多文件编程初探(一)

发现有很多童鞋学了一年半载的C语言还不会多文件编程。很多人到现在一个程序都只有一个源文件(main.cpp或mian.c)。甚至连我的室友大飞哥(我们都大二下学期了)昨天也问我怎么做。其实C语言的多文件并不神秘。哥今天姑且装B一回,说说怎么多文件编程,顺便自己也小结一下。 说明:我用的编程工具为devc++,vc6.0也类似。不过vc.6.0会强迫你建工程,不太方便。 跟着我一步一步来,很简单

勤能补拙 6万+

H3C交换机命令大全,分模块好记忆!

在深入命令之前,我们先来了解H3C交换机的命令行基础。<H3C>[H3C]常用基础命令如下:这些基础命令是操作H3C交换机的敲门砖,熟练掌握后,我们将按模块深入探讨更具体的配置命令。H3C交换机的命令可以按功能模块分类,包括系统管理、接口配置、VLAN操作、链路聚合、路由配置、安全管理等。

网络技术联盟站 782

Imagenet数据集1000类别中英文

英文 {0: 'tench, Tinca tinca', 1: 'goldfish, Carassius auratus', 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', 3: 'tiger shark, Galeocerdo cuvieri', 4: 'hammerhead, hammerhead shark', 5: 'electric ray, cram.

识物专栏 1800

大话C语言:第19篇 多文件编程

C语言多文件编程(也称为多模块编程或多文件项目)是一种将大型程序分解为多个较小的、更易于管理的源文件(通常是.c文件)和头文件(通常是.h文件)的方法。每个源文件包含程序的一部分功能,而头文件则用于声明函数、变量和类型,以便其他源文件可以引用它们。这种方法的主要好处是提高代码的可读性、可维护性和可重用性。

whccf的博客 1750

基于STM32+4G模块设计的智能灌溉系统

当前智能灌溉系统分为三个部分:温湿度采集部分、灌溉系统部分、OneNet云平台。 灌溉系统部分增加刷卡功能,用户可以通过IC卡刷卡将金额刷到灌溉系统设备里,灌溉系统设备里会记录金额,并且在手机可视化页面上会显示当前的设备金额。 金额会随着时间进行递减,按分钟计费,如果计费到0,就无法启动灌溉,需要重新充值金额才能继续。

4512

C语言多文件编程和模块化设计

在C语言开发中,多文件编程和模块化设计是非常重要的概念,它们有助于提高代码的可维护性、可扩展性和可复用性。下面将详细介绍C语言的多文件编程和模块化设计的相关内容。

qq_45315034的博客 591

Microsoft AI SDK 与 SAP ABAP:让企业级 AI 能力触手可及的深度整合指南

借助 Microsoft AI SDK,ABAP 开发者无需跳出熟悉的事务码与数据字典,就能把 GPT‑4 的强大语言理解与生成能力深度植入采购、销售、财务等核心业务流程。只要掌握“初始化 SDK → 构造 Prompt → 解析输出”这一范式,未来无论 Azure OpenAI、OpenAI 还是本地化 LLM,都能在同一套代码骨架内快速切换,实现真正的“AI 即服务”。现在,就让我们在下一行 ABAP 里拥抱智能未来。参考链接均于 2025‑07‑22 提取,推荐读者结合实际版本进一步验证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 431

阿里云 Docker 镜像加速收费后:这些免费替代方案值得收藏

阿里云Docker镜像加速服务收费后,国内开发者急需免费替代方案。本文推荐2025年仍可用的7个免费镜像源,包括轩辕镜像、DaoCloud、网易云等,并提供多源配置方案以提高稳定性。建议开发者在CI/CD环境中配置多个镜像源,避免构建失败。文章还提供了详细的配置步骤和使用建议,适合个人和团队开发者参考。

sg_knight的专栏 1928

模块化编程(C语言)

目录1.什么是模块化编程2.模块化编程的好处3.模块化开发过程如下4.模块化的具体代码实现 1.什么是模块化编程 模块化编程就是我们一个复杂的项目分成很多模块,比如一个单片机项目,就可能分为:主函数模块,液晶显示和数码管显示模块,时间延时模块,温度传感器模块等。 而一个程序工程包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一个模块,每一个模块都有其各自的功能,而每一个.h文件则是声明该模块,相当于功能说明书 模块化编程在嵌入式中是必须要掌握的技能。 2.模块化编程的好处 开发C程

weixin_48678164的博客 4642

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C语言模块化编程技术详解

在C语言中,我们可以使用#include指令来定义模块。这可以通过将模块的源代码文件包含到另一个文件中来实现。在这个例子中,我们使用#include指令将名为module.h的文件包含到当前文件中。

极客代码 1728

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

黑马程序员---C语言学习笔记之语言模块化编程概念

------Java培训、Android培训、iOS培训、.Net培训-------- 07-02 C语言模块化编程概念 1. 概念 所谓模块化编程(多文件开发),就是多文件(.c文件)编程,一个.c 文件和一个.h文件可以被称为一个模块。把功能相似的函数封装在不同的文件中 2.以下场景中会使用头文件 2.1 通过头文件来调用库函数功能 在很多场合,源代码不便向用户公布,只需要

chunhuayun的专栏 554

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

什么是模块化,怎么写一个好的C语言模块?通过标准库,开源库,驱动库学习_c语言模块化

同时声明了开LED灯和关LED灯两个函数具体格式为:#endif.c文件中:

805

【亲测免费】 C高级编程:基于模块化设计思想的C语言开发

C高级编程:基于模块化设计思想的C语言开发 去发现同类优质开源项目:https://gitcode.com/ 资源介绍 本仓库提供了一个名为“C高级编程 基于模块化设计思想的C语言开发 高清 带书签.pdf”的资源文件下载。该文件是一本关于C语言高级编程的电子书,特别强调了模块化设计思想在C语言开发中的应用。 文件特点 高清版本:文件以高清格式呈现,确保阅读体验清晰舒适。 带书签:文件中包含了...

gitblog_06619的博客 463

C语言 模块化编程与进制转换

9.#include ①include是一个预处理指令,不是语句,写完不用加分号; ②#include 是包含系统提供的头文件,#include " " 是包含自己写的文件;  ③文件包含的实质:文件包含的功能是把指定的文件内容插入该命

heyuze的博客 1015

多文件编程与宏的使用

通过将程序拆分为多个源文件(.c)和头文件(.h)实现模块化编程。头文件使用#ifndef/#define/#endif防止重复包含,存放函数声明、宏定义和类型定义;源文件实现具体功能。编译时,源文件生成目标文件后链接为可执行程序。宏处理包括常量定义、函数式替换和条件编译,需注意全局变量声明规范(extern声明在头文件,定义在源文件)。多文件编程提高了代码复用性和可维护性,是现代C项目开发的基础方法。

嵌入式新兵 1135

C语言函数与模块化编程实践指南

实践时,我发现其自动生成的模块化项目结构非常清晰,头文件和源文件分离规范。平台的一键部署功能还能将完整项目打包成可执行程序,省去了手动配置编译环境的麻烦,特别适合初学者验证模块化设计效果。

GarnetFalcon73的博客 279
上一篇: C语言(4) 原码、反码、补码与位运算
下一篇: C语言(8) 变量在内存中的分配原则
VIPqiangqiang
博客等级 码龄14年 7粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值