【C语言】多文件编程以及static关键字

1、多文件编程

  • 把函数声明放在头文件xxx.h中,在主函数中包含相应头文件
  • 在头文件对应的xxx.c中实现xxx.h声明的函数

a、主文件

#include<stdio.h>
#include "MyMain.h"//需要包含头文件,头文件包含我们自定义的函数int main(){int num1;int num2;printf("请输入两个数字:");scanf("%d %d",&num1,&num2);int MAXA_B=max(num1,num2);int ADDA_B=add(num1,num2);printf("%d、%d两数的和%d,最大值为%d\n",num1,num2,ADDA_B,MAXA_B);return 0;}

b、函数1:求和函数,函数的C文件名称不需要和函数名称一致。,且无需添加头文件(放函数声明的头文件)。


int add(int a,int b)
{return a+b;//返回两个值的和。
}

c、函数2:最大值函数

int max (int a,int b)
{return a>b?a:b;//比较大小,返回最大值
}

d、头文件:放函数1和函数2,并在该函数中进行声明。

#ifndef _MYMAIN_H_
#define _MYMAIN_H_
int max (int a,int b);
int add(int a,int b);
#endif

注意

1、定义函数的时候,记得加括号,函数和函数文件名(.c文件)可以不一致。

2、头文件模版需要熟记

#ifndef _文件名_H_

#define _文件名_H_

函数1;

函数2;

#endif

2、gcc命令行编译多文件程序

gcc -g main.c AddA_B.c MaxA_B.c

-g 后面存放需要编辑的文件名称,头文件无法加进去,多个文件用空格隔开,默认编译生产的可执行文件名称为a.exe,可以通过后面加-o 修改文件名

gcc -g main.c func.c -o main.exe
//编译g main.c func.c两个文件,生产main.exe 文件。 

ps:命令行显示中文乱码,修改命令:chcp 65001

3、头文件包含的区别、防止头文件重复包含

  • 当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含。
  • 为了避免同一个文件被include多次,C/C++中有两种方式。
  • 方法一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__// 声明语句#endif

  • 方法二:
#pragma once// 声明语句

4、extern关键字

extern主要用于声明外部变量或函数,当我们将一个变量或函数声明为extern时,那么就表示该变量或函数是在其他地方定义的,我们只是在当前文件中引用它。
示例
 

#include <stdio.h>extern int global_val;
extern void printf_val();int main() {global_val = 100;printf_val();return 0;
}
#include <stdio.h>int global_val;void printf_val() {printf("other->global_val: %d\n", global_val);
}
  • > 表示系统直接按系统指定的目录检索
  • "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检extern关键字
     

5、static 关键字

  • 作用1:隐藏,限制作用域

示例:

#include<stdio.h>
#include "MyMain.h"//需要包含头文件,头文件包含我们自定义的函数int main()
{int num1;int num2;printf("请输入两个数字:");scanf("%d %d",&num1,&num2);int MAXA_B=max(num1,num2);int ADDA_B=add(num1,num2);printf("%d、%d两数的和%d,最大值为%d\n",num1,num2,ADDA_B,MAXA_B);return 0;
}

b、函数1:求和函数


static int add(int a,int b)
{return a+b;//返回两个值的和。
}

c、函数2:最大值函数

int max (int a,int b)
{return a>b?a:b;//比较大小,返回最大值
}

d、头文件:

#ifndef _MYMAIN_H_
#define _MYMAIN_H_
int max (int a,int b);
int add(int a,int b);
#endif

编译结果

gcc -g main.c AddA_B.c MaxA_B.c//编译指令main.c:11: undefined reference to `add'collect2.exe: error: ld returned 1 exit status

在上面文件中,我在AddA_B.c文件中 int add(int a,int b)前面加上static,重新编译就会报错,主要就是我将AddA_B.cw文件中函数通过static 进行隐藏,导致其他函数无法调用。

当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问

对于函数来讲,static 的作用仅限于隐藏

应用场景:智能网关项目:zigbee ble wifi模块的同事都需要用日志打印的函数,如何设计一个日志打印函数给他们使用?,

通过该关键字就可以进行隐藏数据,限制查看权限,只能查看日志,而不是所有数据都可以看。

  • 作用2:管理生命周期

程序实例

打印程序的调用次数

a、未使用static版本

int add( )
{ int a=0;a++;return a;
}
#ifndef _NUM_H_
#define  _NUM_H_int add();#endif
#include <stdio.h>
#include"num.h"
int main()
{for(int i=0;i<5;i++){int a=add();printf("%d\n",a);}return 0;
}
gcc -g man.c number.c -o a.exe//编译指令
//编译结果
1
1
1
1
1

出现该结果的原因是由于每次调用函数add时,调用完a的值就清除了,所以每次调用打印都会重置,结果都是1.

b、使用static版本

int add( )
{ int a=0;static a++;return a;
}
#ifndef _NUM_H_
#define  _NUM_H_int add();#endif
#include <stdio.h>
#include"num.h"
int main()
{for(int i=0;i<5;i++){int a=add();printf("%d\n",a);}return 0;
}
gcc -g man.c number.c -o a.exe//编译指令
//编译结果
1
2
3
4
5

成功打印调用结果,a是add()的局部变量 -只初始化一次

每次调用函数add()''a’值不会被重置

应用案例:点餐屏:统计损耗(打印机)模块的使用次数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6、鸿蒙学习-Stage模型应用程序包结构

基于Stage模型开发的应用&#xff0c;经编译打包后&#xff0c;其应用程序的结构如下图应用程序包结构&#xff08;Stage模型&#xff09;所示。开发者需要熟悉应用程序包结构相关的基本概念。 一、在开发态&#xff0c;一个应用包含一个或者多个Module&#xff0c;可以在DevE…

【管理咨询宝藏60】顶级咨询公司对医药行业的研究报告

【管理咨询宝藏60】顶级咨询公司对医药行业的研究报告 【格式】PDF 【关键词】医疗行业、战略咨询、行业洞察 【核心观点】 - 195页精品内容&#xff0c;让你彻底透视医疗行业的发展现状和未来趋势 - 前20大交易约占医疗交易总额的65%&#xff1b;医疗行业大部分为制药业投资交…

c++的学习之路:5、类和对象(1)

一、面向对象和面向过程 在说这个定义时&#xff0c;我就拿c语言举例&#xff0c;在c语言写程序的时候&#xff0c;基本上就是缺什么函数&#xff0c;就去手搓一个函数&#xff0c;写的程序也只是调用函数的&#xff0c;而c就是基于面向对象的开发&#xff0c;他关注的不再是单…

DFS算法(C/C++)(内含立例题)

DFS&#xff1a; DFS又称深度优先搜索&#xff0c;是一种图运算方法&#xff0c;它从第一个节点走起&#xff0c;一直往下走&#xff0c;一直走到不能继续再走&#xff0c;就返回上一个节点&#xff0c;继续搜索其他地方&#xff0c;直到找到目标节点为止。 DFS可以解决迷宫问…

每日一题 --- 有效的字母异位词[力扣][Go]

有效的字母异位词 题目&#xff1a;242. 有效的字母异位词 给定两个字符串 *s* 和 *t* &#xff0c;编写一个函数来判断 *t* 是否是 *s* 的字母异位词。 **注意&#xff1a;**若 *s* 和 *t* 中每个字符出现的次数都相同&#xff0c;则称 *s* 和 *t* 互为字母异位词。 示例 …

基于单片机多功能智能台灯设计

**单片机设计介绍&#xff0c;基于单片机多功能智能台灯设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的多功能智能台灯设计是一个集硬件与软件于一体的综合性项目&#xff0c;旨在为用户提供更加便捷、舒适和节…

安静:内向性格的竞争力 - 三余书屋 3ysw.net

精读文稿 这期我们介绍的这本书叫做《安静》&#xff0c;副标题是《内向性格的竞争力》。本书共有267页&#xff0c;我会用大约25分钟的时间为你讲述书中的精髓。内向性格具备什么样的竞争力&#xff1f;内向性格的人在人际交往和日常生活中似乎总是吃亏&#xff0c;因为他们不…

[AutoSar]BSW_ECUC模块介绍

目录 关键词平台说明一、ECUC 的定义二、Definition of Partitions三、Variant Resolver Description四、Definition of PDUs 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xf…

YOLOv5 | 鬼魅(幽灵)卷积 | 改进Ghost卷积轻量化网络

目录 原理简介 代码实现 yaml文件实现 检查是否添加执行成功 完整代码分享 论文创新必备 启动命令 由于内存和计算资源有限&#xff0c;在嵌入式设备上部署卷积神经网络 (CNN) 很困难。特征图中的冗余是那些成功的 CNN 的一个重要特征&#xff0c;但在神经架构设计中很…

企业计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密流程步骤

在网络技术飞速发展的今天&#xff0c;越来越多的企业走向了数字化办公模式&#xff0c;网络为企业的生产运营提高了效率&#xff0c;为企业带来了极大便利&#xff0c;但网络是一把双刃剑&#xff0c;在为人们提供便利的同时也会带来数据安全问题&#xff0c;网络数据安全一直…

智能优化算法 | Matlab实现牛顿-拉夫逊优化算法Newton-Raphson-based optimize(内含完整源码)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现牛顿-拉夫逊优化算法Newton-Raphson-based optimize(内含完整源码) 源码设计 % ------------------------------------------------------------------------------------------------…

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装?

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装? NTFS交换数据流(Alternate Data Streams, ADS)是NTFS文件系统特有的一种功能,它允许在同一个文件名下存储多个数据流。除了默认的数据流(通常用于存储文…

29---Nor Flash电路设计

视频链接 Nor Flash硬件电路设计01_哔哩哔哩_bilibili NOR FLASH电路设计 1、NOR FLASH介绍 NOR Flash最早是由Intel公司于1988年开发出的。 NOR Flash虽容量小但速度快,最大特点是支持芯片内执行&#xff08;XIP&#xff09;&#xff0c;即程序可以直接在NOR flash的片内…

欧拉系统部署ftp服务器

1.先检查是否已经安装ftp vsftpd -v 2.安装vsftpd yum install vsftpd 3.修改ftp配置文件 vim /etc/vsftpd/vsftpd.conf 4.启动ftp systemctl start vsftpd 5.查看是否启动 systemctl status vsftpd 6.设置为开机自启 systemctl enable vsftpd 7.查看端口是否开启 net…

uniapp 微信小程序 canvas 手写板获取书写内容区域并输出

uni.canvasGetImageData 返回一个数组&#xff0c;用来描述 canvas 区域隐含的像素数据&#xff0c;在自定义组件下&#xff0c;第二个参数传入自定义组件实例 this&#xff0c;以操作组件内 组件。 // 获取目标 canvas 的像素信息 pixelData let canvas uni.createSelector…

Wireshark使用相关

1.wireshark如何查看RST包 tcp.flags.reset1 RST表示复位&#xff0c;用来异常的关闭连接&#xff0c;在TCP的设计中它是不可或缺的。发送RST包关闭连接时&#xff0c;不必等缓冲区的包都发出去&#xff08;不像上面的FIN包&#xff09;&#xff0c;直接就丢弃缓存区的包发送R…

【功能实现】新年贺卡(蓝桥)

题目分析&#xff1a; 想要实现一个随机抽取功能 功能拆解&#xff1a;题目给了数组&#xff0c;我们采用生成随机数的方式&#xff0c;随机数作为数组的索引值访问数组的值。 并返回获取到的值&#xff0c;将获取到的值插入到页面中。 document.addEventListener(DOMConten…

循序渐进丨MogDB 对 Oracle DBLink兼容性增强

本特性自 MogDB 5.0.0版本开始引入&#xff0c;支持 Oracle DBLink语法&#xff0c;可以使用符号访问 Oracle 数据库中的表。 示 例 01 环境准备 MogDB 环境 已安装 MogDB 数据库。已安装oracle_fdw插件&#xff0c;具体安装方法参见oracle_fdw安装文档https://docs.mogdb.io/…

自定义你的商店 – 设计WooCommerce商店的新方法

WooCommerce 8.8即将推出&#xff0c;带来了一种无需代码即可创建精美商店的新方法。向“自定义你的商店”问好&#xff0c;这是一项全新功能&#xff0c;将取代“个性化你的商店”入门步骤。 自定义你的商店将利用最新的WordPress站点编辑工具以及酷炫的新Pattern Assembler …

誉天华为认证云计算课程如何

HCIA-Cloud Computing 5.0 课程介绍&#xff1a;掌握华为企业级虚拟化、桌面云部署&#xff0c;具备企业一线部署实施及运维能力 掌握虚拟化技术、网络基础、存储基础等内容&#xff0c;拥有项目实施综合能力 满足企业虚拟化方案转型需求&#xff0c;应对企业日益多样的业务诉求…