【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’值不会被重置

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JWT的实现及其适用场景

官方文档 一、什么是JWT JWT&#xff08;全称JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。此信息是经过数字签名的&#xff0c;因此可以验…

分页多线程处理大批量数据

1.业务场景 因为需要从一个返利明细表中获取大量的数据&#xff0c;生成返利报告&#xff0c;耗时相对较久&#xff0c;作为后台任务执行。但是后台任务如果不用多线程处理&#xff0c;也会要很长时间才能处理完。 另外考虑到数据量大&#xff0c;不能一次查询所有数据在内存…

LaTeX论文汇报ppt模板

在 LaTeX 的 beamer 类中&#xff0c;您可以使用不同的主题和模板来创建适合论文汇报的演示文稿。以下是一个使用了比较正式的 Madrid 主题的模板&#xff0c;您可以基于这个模板进行定制和扩展&#xff0c;以满足您论文汇报的需求。当需要在ppt输入中文的时候需要将第一行中的…

北京中科富海低温科技有限公司确认出席2024第三届中国氢能国际峰会

会议背景 随着全球对清洁能源的迫切需求&#xff0c;氢能能源转型、工业应用、交通运输等方面具有广阔前景&#xff0c;氢能也成为应对气候变化的重要解决方案。根据德勤的报告显示&#xff0c;到2050年&#xff0c;绿色氢能将有1.4万亿美元市场。氢能产业的各环节的关键技术突…

大数据技术在工厂生产数字转型中的应用与价值

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 随着大数据技术的快速发展&#xff0c;越来越多的企业开始关注并应用大数据技术&#x…

C语言:自定义类型(结构体)

目录 一、结构的特殊声明二、结构的自引用三、结构体内存对齐1.对齐规则2.为什么存在内存对齐(1)平台原因 (移植原因)&#xff1a;(2)性能原因&#xff1a; 3.修改默认对齐数 四、结构体传参五、结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段使用的注意…

tftp使用

下载 sudo apt-get install tftpd-hpa 创建文件夹 mkdir /home/ljl/work/tftpd mkdir /home/ljl/tftpd chmod 777 tftpd/编辑 sudo vim /etc/default/tftpd-hpa //服务器端 sudo apt-get install tftp-hpa //客户端编辑权限 sudo vi /etc/default/tftpd-hpa 内容&#xff1…

jenkins构建完成后部署到本机,无法读取容器外文件夹

项目背景&#xff1a; Dockerjenkins 构建完成后&#xff0c;要把打包的dist文件夹内容移动到网站目录 /www/wwwroot/xxxxxx 文件夹下&#xff1b;但是获取不到jenkins容器外的文件夹。 解决办法&#xff1a; 在容器中&#xff0c;添加挂载/映射本机目录&#xff0c;把网站…

两直线交点算法 C

求两直线交点算法 有中间交点 则CD在AB异侧 A B A C A B A D \nobreak AB \times AC \newline AB \times AD ABACABAD 异号 叉乘后相乘小于零 等于零的几种情况 A B C与AB共线 D与AB共线 求交点&#xff0c;可由面积比例用叉乘计算 C E C D S A B C S A B C D . \frac…

yarn的使用与安装

文章目录 1.安装方式一&#xff1a;全局安装yarn2.安装方式二&#xff1a;通过开启corepack安装3.其他部分yarn命令4.Yarn镜像配置5.Pnpm使用方法同yarn无区别,可按照以上yarn的安装以及使用方式来使用pnmp 1.安装方式一&#xff1a;全局安装yarn 全局安装yarn npm i yarn -g…

视频记录历史播放位置效果

简介 每次打开页面视频从上一次的播放位置开始播放 利用lodash库做节流 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

自动驾驶---Motion Planning之轨迹Path优化

1 背景 在之前的几篇文章中,不管是通过构建SL图《自动驾驶---Motion Planning之Path Boundary》,ST图《自动驾驶---Motion Planning之Speed Boundary》,又或者是构建SLT图《自动驾驶---Motion Planning之构建SLT Driving Corridor》,最终我们都是为了得到boundary的信息。 …

牛客题霸-SQL进阶篇(刷题记录二)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 部分题目因…

【隐私计算实训营003详解隐私计算框架及技术要点】

1. 隐语架构一览 1.1 隐语架构 隐语架构通常指的是一种面向隐私保护计算的软件框架或解决方案&#xff0c;它采用了密码学、可信执行环境&#xff08;TEE&#xff09;、多方安全计算&#xff08;MPC&#xff09;等多种隐私保护技术来实现在数据加密状态下进行计算&#xff0c;…

【计算机网络篇】数据链路层(2)封装成帧和透明传输

文章目录 &#x1f95a;封装成帧和透明传输&#x1f388;封装成帧&#x1f388;透明传输&#x1f5d2;️面向字节的物理链路使用字节填充的方法实现透明传输。&#x1f5d2;️面向比特的物理链路使用比特填充的方法实现透明传输。 &#x1f6f8;练习 &#x1f95a;封装成帧和透…

河北盟盾:高性能钢结构防火涂料,安全守护新力量

在现代化建设的浪潮中&#xff0c;防火安全日益成为各行业关注的焦点。河北盟盾防火材料有限公司以其卓越的产品质量和稳定性能&#xff0c;赢得了市场的广泛认可。公司始终坚持以科技为先导&#xff0c;以创新为动力&#xff0c;不断推出高品质、高性能的防火涂料产品。 公司的…

通讯录的动态实现

文章目录 通讯录的动态实现模块化编程通讯录的框架构建功能的具体实现初始化通讯录添加联系人删除联系人查找联系人修改联系人打印通讯录排序通讯录检查容量并扩容加载通讯录保留通讯录销毁通讯录 完整代码总结 通讯录的动态实现 模块化编程 分文件 不同模块放在不同的文件下 …

一招鲜吃遍天!CleanMyMac X苹果电脑Mac管家让你的Mac倍儿爽

一招鲜吃遍天&#xff01;CleanMyMac X 苹果电脑Mac管家让你的 Mac 倍儿爽 &#xff0c; 轻松清理、优化、保护你的 Apple 设备&#xff0c;体验前所未有的流畅&#xff0c;在当今数字化时代&#xff0c;我们的生活离不开各类电子设备&#xff0c;尤其是苹果电脑 Mac。 然而&am…

CISP 4.2备考之《安全支撑技术》知识点总结

文章目录 第一节 密码技术第二节 标识和身份鉴别技术第三节 访问控制技术 第一节 密码技术 密码学发展阶段&#xff1a;古典、近代、现代和公钥密码学及特点。 密码系统组成&#xff1a;明文、加密、密钥、解密、密文。 柯克霍夫原则&#xff1a;密钥保密&#xff0c;算法公开…

【Node.js】npx

概述 npx 可以使用户在不安装全局包的情况下&#xff0c;运行已安装在本地项目中的包或者远程仓库中的包。 高版本npm会自带npx命令。 它可以直接运行 node_modules/.bin 下的 exe 可执行文件。而不像之前&#xff0c;我们需要在 scripts 里面配置&#xff0c;然后 npm run …