C语言之模块化、预处理(条件编译)

news/2024/5/2 13:31:28/文章来源:https://blog.csdn.net/weixin_46372074/article/details/127007310

模块化、预处理

  • 1. C 模块化
    • 1.1. 头文件 .h
      • 1.1.1. 用户头文件
      • 1.1.2. extern 关键字
    • 1.2. c文件
  • 2. 预处理指令(以 # 开头)
    • 2.1. 宏定义
    • 2.2. 条件编译
    • 2.3. #ifdef、#ifndef、#endif
    • 2.4. defined() 运算符

1. C 模块化

  • 模块化编程的核心思想: 将系统的各个功能进行封装,变成一个个独立的模块,其他人只需要使用你所提供的 函数 和 变量 等,就可以完成相对应的功能.

  • 模块化的本质也就是,新建一个.c和.h文件

1.1. 头文件 .h

#include 可以引用用户和系统头文件。

1.1.1. 用户头文件

  • 为了防止 一个头文件被引用两次,编译器会处理两次头文件的内容 的错误.
    标准的做法是把文件的整个内容放在条件编译语句中,如下:

    文件名 Xxx.h 开头大写

    #ifndef HEADER_FILE
    #define HEADER_FILEthe entire header file file( 定义宏, 定义结构体, extern 变量, 声明函数 )#endif
    
  • HEADER_FILE 格式:

    1. 以 _ 开头(结尾);
    2. 将 . 换成 _ ;
    3. 字符全部大写.

1.1.2. extern 关键字

extern 这个关键字的真正的作用是引用不在同一个文件中的变量或者函数

    1. .h文件定义extern变量文件:   extern unsigned int **全局**变量名2. .c文件使用extern变量的文件: unsigned int **全局**变量名

1.2. c文件

    1. include "xxx.h" // .c文件中,开头小写(.h文件 开头大写)2. 将.h文件中的 `extern` 关键字修饰的变量 在.c文件中去掉 `extern` 再声明一次3. 将.h文件中的函数声明写出函数体.

2. 预处理指令(以 # 开头)

2.1. 宏定义

#define  标识符()  常量   //注意, 最后没有分号

程序中用标识符来表示这个常量. 一直到源程序结束, 提前终止:

#undef  标识符

2.2. 条件编译

  • #if、#elif、#else 和 #endif 都是预处理命令,
  • 在预处理阶段执行, 根据情况保留代码, 不仅保证了代码正确, 还减小了编译后文件的体积. 这种机制被称为条件编译

在这里插入图片描述

### 2.2.1. DEBUG实例 
```c
/* 条件编译: 只保留符合条件的代码 */
#include <stdio.h>#define DEBUG 1 // 0 NO; 1 YESint main()
{
#if DEBUGprintf("DEBUG...\n");
#endifreturn 0;
}
```

2.3. #ifdef、#ifndef、#endif

#ifdef     判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef    与#ifdef相反,判断某个宏是否未被定义

实例链接

2.4. defined() 运算符

预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。
已定义,则值为真(非零)。
未定义,则值为假(零)。

#include <stdio.h>#define DEBUG "定义DEBUG" //定义DEBUG#if defined(DEBUG) //DEBUG已经定义了, true
#undef DEBUG
#define DEBUG printf("您已定义DEBUG\n")#else
#define DEBUG printf("已为您定义DEBUG\n")#endif
int main()
{DEBUG;return 0;
}

在这里插入图片描述

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

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

相关文章

CDH6.3.2安装python3

背景&#xff1a;需要使用pyspark或者python去自动读取远程文件&#xff0c;但是CDH集群里面自带着python2.7.5&#xff0c;python3.0是以后的趋势&#xff0c;所以决定自己安装python3。以下的安装步骤是参照网上的步骤&#xff0c;实操是自己亲自操作的。 1.1 系统版本信息 …

Vim编辑器的使用

一、什么是Vim编辑器 Vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 简单的来说&#xff0c;vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具…

.NET MAUI学习笔记——1.初识.NET MAUI_初级篇

文章目录一、 引言二、什么是.NET MAUI&#xff1f;1. .NET MAUI为谁服务&#xff1f;2. .NET MAUI是怎样工作的&#xff1f;3. .NET MAUI提供了什么&#xff1f;3.1. 设备特性的跨平台API3.2. 单一项目3.3. 热重载三、结尾一、 引言 打算开发一款简单的Android的App&#xff…

springboot-鑫源停车场管理系统 毕业设计 -附源码 290915

springboot鑫源停车场管理系统 摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于停车场管理也是十分常见的。过去使用手工的管理方式对停车场进行管理&#xff0c;造成了管理繁琐、难以维护等问题&#xff0c;如今使用计算机对…

03-JVM-对象内存、执行引擎

一、创建对象的方式 new、Xxx的静态方法、XXXBuilder/XXXFactory的静态方法Class的newInstance&#xff0c;只能调用空参构造器&#xff0c;权限必须是publicConstruct的newInstance&#xff0c;可以调用空参、带参的构造器&#xff0c;权限无要求Clone()&#xff0c;不调用构…

瑞吉外卖(16) - 新增菜品功能开发

文章目录需求分析数据模型dish表dis flaow表代码开发搭建框架新增dishFlavor实体类新增Mapper接口DishFlavorMapper新增业务接口DishFlavorService新增业务层实现类DishFlavorServiceImpl新增控制层DishController梳理交互过程编辑CategoryControoler下拉框功能测试导入DTO编写…

香橙派Orange Pi i96 初次使用遇到的坑和解决方法+附加c# iot .net 代码实例

香橙派Orange Pi i96这个主板是香橙派最便宜的一样主板&#xff0c;功能也不少&#xff0c;我觉得可以满足我的需求&#xff0c;如果可以用好的话&#xff0c;可以做很多东西&#xff0c;批量买也便宜&#xff0c;做出来的产品&#xff0c;定价也不用很高&#xff0c;符合效益 …

4计算机网络与信息安全——软件设计师

一、七层模型 内容&#xff1a; 习题&#xff1a; 局域网不能通过三层通信 二、网络技术标准与协议 一般分为4/5层(没有明确说明&#xff0c;了解主要几层即可) TCP协议: DHCP协议 DNS协议 递归直接回答&#xff0c;迭代刨根到底 三、网络类型与拓扑类型 计算机网络按不同…

一起Talk Android吧(第三百八十五回:数据绑定-DataBinding总结)

文章目录数据绑定使用方法7.单向数据绑8.双向数据绑定9.绑定事件演示结果使用总结各位看官们&#xff0c;大家好&#xff0c;上一回中咱们说的是数据绑定-DataBinding的例子,这一回中咱们继承介绍该例子。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&am…

线程池概念2

线程池类图 ExecutorService:是一个线程池最基本的接口&#xff0c;提供了提交任务&#xff0c;关闭线程池这些基本的方法。 ScheduledExecutorService:扩展接口&#xff0c;在基础线程池的功能上又新增了任务调度的功能&#xff0c;可以用来定时执行任务。 线程池状态 线程…

Devtools Console 面板输入了 1+1 ,浏览器内部发生了什么?

背景 新来的实习生妹子问了一个问题&#xff1a;「你看 Chrome 的 Devtools 调试工具&#xff0c;代码写一半还没运行下面就会提示输出结果&#xff0c;这个咋做到的&#xff1f;」 咋做的&#xff1f;对于 Devtools 的内部执行逻辑&#xff0c;咱不了解&#xff0c;但咱也不能…

WhatsApp和WhatsApp Business之间的区别

关键词&#xff1a;WhatsApp、WhatsApp Business WhatsApp 无疑是一款超级方便、免费且毫不费力的即时通讯应用程序。这就是庞大的用户群的原因。对于企业来说&#xff0c;它也是一个超级方便、免费且不费吹灰之力的即时通讯应用程序。特别是自从 WhatsApp 推出了 WhatsApp Bus…

《MySQL DBA封神打怪之路》专栏学习大纲

《MySQL DBA封神打怪之路》专栏学习大纲 文章目录《MySQL DBA封神打怪之路》专栏学习大纲1、作者介绍2、专栏介绍3、专栏部分文章截图3.1.所有文章一栏3.2.文章内容截图4、专栏大纲学习指南4.1对数据库的初步认识4.2.四种类型的SQL语句基本使用4.3.超丰富的多表联查案例4.4.事物…

消除笔去水印怎么做?教你怎么用这些消除笔软件

在网上看到好看的照片想要用作壁纸&#xff0c;但是上面有水印看起来不好看怎么办&#xff1f;我们可以用有消除笔的软件将图片水印去除&#xff0c;那么消除笔去水印怎么做呢&#xff1f;今天的这个教程分享给你们。方法一&#xff1a;借助“Styler”进行去水印操作 这是一款拥…

Echarts绘制geo地图属性设置大全(一)

1、Echarts版本 "echarts": "^5.3.3", 2、基础地图绘制&#xff08;以中国地图为例&#xff09; 绘制地图需要有用于绘制地理坐标系的数据&#xff0c;如示例使用的china.js <template><div ref"mapBar" class"map-class"&…

面试之HashMap

1.初始大小&#xff1a;HashMap默认初始大小是16&#xff0c;这个默认值是可以设置的&#xff0c;如果事先知道大概的数据量有多大&#xff0c;可以通过修改默认初始大小&#xff0c;减少动态扩容的次数&#xff0c;这样会大大提高HashMap的性能 2.动态扩容&#xff1a;最大 装…

兼容性测试包含哪几类呢?

兼容性测试包含哪几类呢? (1)浏览器方面 关于浏览器的兼容性测试&#xff0c;主要是检查页面的交互、元素和样式展示是否正常。我们都知道&#xff0c;目前市面上主流的浏览器非常多&#xff0c;像&#xff1a;360、搜狗、火狐等等。 在进行测试的时候&#xff0c;由于兼容性问…

2022出海东南亚:越南电商市场现状及网红营销特点

近几年&#xff0c;东南亚整体发展态势非常好&#xff0c;加上国内市场饱和&#xff0c;不少国内企业在计划出海或已经出海东南亚。作为东南亚第二大电商市场&#xff0c;越南自然也成了香饽饽&#xff0c;越南蓬勃发展的数字经济和电商领域&#xff0c;让其成为了卖家挖掘新商…

Vue 力导图d3js 实现

PowerBI 自定义组件推荐用D3JS 实现&#xff0c;实现一个PowerBI 的力导图组件&#xff0c;为调试方便&#xff0c;先用Vue 实现一个&#xff0c;然后再移植到PowerBI 中&#xff0c;话不多说&#xff0c;上效果&#xff1a; 体验入口 上代码是最好的老师&#xff1a; <t…

【easyExcel】后端将模板文件写入流供前端下载报错,easyexcel下载模板文件出错

目录事件起因环境和工具操作过程解决办法参考内容&#xff1a;结束语事件起因 报错内容&#xff08;我主要搜索的两个错误内容点&#xff09;&#xff1a; com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure 和 Caused by: org.apache.poi.openx…