【c语言】详解宏定义#define 各种使用方法

news2024/11/13 18:02:38

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

 c语言系列专栏: c语言之路重点知识整合 

#define处于预处理期过程,预处理期过程知识点:预处理详解

目录

一、宏替换格式

宏替换结尾不随意加" ; "号 !!!

 二、替换类型名称 对比typedef的差异

差异:

 三、替换一个函数或表达式

 四、嵌套宏替换

 五、用宏和typedef创建一个布尔型数据

 六、带参数的宏定义

 七、定义可计算数组长度的宏

总结 


一、宏替换格式

宏替换简称宏的格式:
        #define 宏替换名称  替换内容

#define MAX 100
int main ()
{
    int a[MAX];
    return 0;
}

 将TYPE替换成int:

#define就是查找、替换的过程

宏替换结尾不随意加" ; "号 !!!

 如果在#define语句后加分号;                  替换的就是200;      而不是200

 二、替换类型名称 对比typedef的差异

#include<stdio.h>
#define POINT_A int*
typedef int * POINT_B ;
int main ()
{
    POINT_A p1,p2;    //预处理替换后: int* p1,p2; 即p1是指针变量 p2是普通int变量
    POINT_B q1,q2;    //编译后:q1是指针变量 q2也是指针变量
    int a=10;
    p1=&a;
      p2=&a;//此处有bug

    q1=&a;
    q2=&a;
    return 0;
}

 替换!!!   POINT_A p1,p2; 也即 int* p1,p2;   p1为指针类型,p2为int类型。

差异:

1   #define执行的时点是预处理即编译前 typedef执行的时点是编译时

2   #define只是单纯的“查找替换”把源代码变成另外的样子,并没有创造新的类型名称。

3   typedef是定义的一个类型名,编译器把它当作一种新的类型来看待。所以定义类型常用typedef

 三、替换一个函数或表达式

表达式、函数也可以进行替换,在预处理期会变形成宏替换后的代码,然后进行编译

#include<stdio.h>
#define INTEGER int     //宏 代替 类型
#define PRINT printf("%d\n",a)     //宏 代替 函数
#define POINT int*     // 宏 代替 指针类型
int main ()
{
    INTEGER a =100;    //将替换成: int a =100;
    POINT p=&a;    //将替换成:int* p=&a;
    *p=888;
    PRINT;    //将替换成:printf("%d\n",a);
    return 0;
}

 四、嵌套宏替换

对宏再进行宏替换

不用循环的1000个helloworld: 

#include<stdio.h>
#define A printf("helloworld.\n");
#define B A A A A A A A A A A
#define C B B B B B B B B B B
#define D C C C C C C C C C C
int main ()
{
    D
    return 0;
}

 五、用宏和typedef创建一个布尔型数据

 boolean逻辑类型true和false   c语言中没有布尔类型,可以使用宏和typedef创建一个 布尔型

#include<stdio.h>

#define True 1         //将True全部 查找替换 成 1
#define False 0     //将False全部 查找替换 成 0

typedef int BOOLEAN;     //定义一个新类型名

int main ()
{
    BOOLEAN SUCCESS=True;    //比 int SUCCESS = 1 更具有可读性
    return 0;
}

 还可以定义sex男女类型等,增强代码的可读性。

六、带参数的宏定义

内容模板:可变内容 不变内容

变化的地方用(a,b)代替

#include<stdio.h>
#define ADD(a,b) a + b
int main()
{
    printf("%d\n",ADD(3,5) );        //替换成:printf("%d\n",3+5 )
    printf("%d\n",ADD(1+2,3+5) );    //替换成:printf("%d\n",1+2+3+5 )
}

七、定义可计算数组长度的宏

 变化的地方( 数组名 )用arr_name代替

#include<stdio.h>
#define LENGTH(arr_name) sizeof(arr_name)/sizeof(arr_name[0])
int main()
{
    int arr[]={1,2,3,4,5};
    float arr1[]={1.1,2.2,3.3};

    printf("%.1f\n",LENGTH(arr1) );  //被替换成:sizeof(arr1)/sizeof(arr1[0])

    int i;
    for(i=0;i<LENGTH(arr) ;i++)    //被替换成:for(i=0;i<sizeof(arr)/sizeof(arr[0]) ;i++)
    {
        printf("%d\n",arr[i]);
    }
}

注: #define LENGTH(arr_name) sizeof(arr_name)/sizeof(arr_name[0])

LENGTH(arr_name)中间没有空格!!!一个整体为宏,否则被替换成(arr_name)

定义有参数的宏时,可变部位()紧挨宏名

总结 

宏的本质是:查找、替换!

宏的作用是:增强可读性、灵活性!

 大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!

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

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

相关文章

vue+Nodejs+Koa搭建前后端系统(三)--koa-generator项目优化修改

前言 计算机系统为Windows 10 专业版 修改package.json配置 原package.json文件中scripts字段的配置字段为&#xff1a; 在终端运行 npm run dev可能会报错 ‘.’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决方法就是修改package.json文件中dev…

Apache Zeppelin系列教程第一篇——安装和使用

一、Apache Zeppelin 介绍 Apache Zeppelin是一种开源的Web笔记本类型交互式数据分析工具&#xff0c;它提供了基于浏览器的界面&#xff0c;允许数据工程师和科学家通过各种语言和工具&#xff0c;如Scala, Python, SQL, R,等等&#xff0c;交互式地进行数据分析、可视化以及…

Word控件Spire.Doc 【脚注】字体(2): 在C#, VB.NET中设置Word字体

Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

执行kubectl命令失败server was refused问题解决

在宿主机上执行kubectl 命令时&#xff0c;出现如下错误 [rootroot ~] kubectl get namespaces The connection to the server xxx.xx.xx.xx:6443 was refused - did you specify the right host or port? 然后再网上找寻解决方案&#xff0c;发现各种各样的解决方案都存在。…

API淘宝数据接口

如果你想在自己的应用中使用淘宝的数据&#xff0c;那么对接淘宝数据接口是必不可少的一步。本文将介绍如何对接API淘宝数据接口&#xff0c;以便你能够顺利获取和使用淘宝的数据。 步骤一&#xff1a;​​获取App Key和App Secret​​ 首先&#xff0c;在淘宝开放平台申请AP…

深入浅出:CAN通信之CCP协议

CCP(CAN Calibration Protocol) CAN标定协议(用于标定系统与ECU之间的通信) CCP协议在应用层&#xff0c;使用CAN的数据帧来传输命令 CRO数据帧(主设备想从设备发送) CRO报文&#xff1a;CCP报文帧格式为CMD CTR DATA&#xff0c;即Command、Counter、Data&#xff0c;其中…

opencv cuda版本windows编译

目录 1. 编译准备2. 编译3. 遇到的问题及解决方案3.1 boostdesc_bgm.i,vgg_generated_48.i等文件的缺失3.2 fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录 1. 编译准备 编译工具是cmakevisual studio2022&#xff0c;首先安装这两个工…

6个优化策略,助你降低K8S成本

Kubernetes 早已成为容器编排引擎的事实标准&#xff0c;而随着 Kubernetes 环境的复杂性持续增长&#xff0c;成本也在不断攀升。CNCF 发布的调查报告《Kubernetes 的 FinOps》显示&#xff0c;68%的受访者表示 Kubernetes 开销正在上涨&#xff0c;并且一半的人所在的组织经历…

WebSocket 详解

WebSocket WebSocket 是一种支持双向通讯网络通信协议。意思就是服务器可以主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息属于服务器推送技术的一种. 特点&#xff1a; &#xff08;1&#xff09;建立在 TCP 协议之上&#xff0c;服务器端的实现比较容…

【MATLAB数据处理实用案例详解(13)】——利用Elman网络实现上证股市开盘价预测

目录 一、问题描述二、Elman网络预测上证股市开盘价原理三、算法步骤3.1 加载数据3.2 构造样本集3.3 划分训练集和测试集3.4 创建Elman神经网络3.5 网络训练3.6 测试 四、结果展示 一、问题描述 选择2005年6月30日至2006年12月1日的上证开盘价进行预测分析。数据保存在elm_sto…

制冷暖通工业互联网平台服务商

制冷暖通工业互联网平台服务商可以提供以下服务&#xff1a; 系统架构设计&#xff1a;根据客户需求&#xff0c;制定适合的系统架构和技术路线&#xff0c;提供全面的技术咨询和方案设计服务。 平台开发和定制化&#xff1a;根据客户需求和系统设计&#xff0c;进行平台开发和…

【go】三色标记-垃圾回收机制

垃圾回收原因 &#xff1a; 垃圾回收是一种内存管理技术&#xff0c;它的主要目的是自动管理程序中的内存分配和释放&#xff0c;以减少内存泄漏和野指针等问题 赋值器与回收器&#xff1a; 赋值器&#xff08;Mutator&#xff09;是指程序中的执行部分&#xff0c;负责创建…

c++11 标准模板(STL)(std::priority_queue)(五)

适配一个容器以提供优先级队列 std::priority_queue 定义于头文件 <queue> template< class T, class Container std::vector<T>, class Compare std::less<typename Container::value_type> > class priority_queue; priority_queu…

docker 安装应用程序

此篇文章以 mysql 安装为例&#xff1a; 一、这里我们拉取官方的最新版本的镜像 docker pull mysql:latest二、使用以下命令来查看是否已安装了 mysql docker images在上图中可以看到我们已经安装了最新版本&#xff08;latest&#xff09;的 mysql 镜像。 三、运行容器 安…

一天学完UCOS III(上)

一、UCOS系统中的一些概念 1.UCOS任务状态 2.任务控制块&#xff08;OS_TCB&#xff09;&#xff1a;保存任务信息结构体 3.任务堆栈&#xff08;CPU_STK&#xff09;&#xff1a;创建任务时传把任务堆栈的参树传入 4.任务优先级&#xff1a;高优先级任务可以抢占低优先级任务…

NDK OpenGL渲染画面效果

NDK系列之OpenGL渲染画面效果技术实战&#xff0c;本节主要是通过OpenGL Java库&#xff08;谷歌对OpenGL C库做了JIN封装&#xff0c;核心实现还是在Native层&#xff09;&#xff0c;实现页面渲染&#xff0c;自定义渲染特效。 实现效果&#xff1a; 实现逻辑&#xff1a; 1…

如何学习FPGA?莱迪斯深力科电子LCMXO2-4000HC-4TG144C MachXO2系列 FPGA可编程逻辑简介

如何学习FPGA&#xff1f;莱迪斯深力科电子LCMXO2-4000HC-4TG144C MachXO2系列 FPGA可编程逻辑简介 FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作…

【高分论文密码】大尺度空间模拟预测与数字制图

大尺度空间模拟预测和数字制图技术和不确定性分析广泛应用于高分SCI论文之中&#xff0c;号称高分论文密码。大尺度模拟技术可以从不同时空尺度阐明农业生态环境领域的内在机理和时空变化规律&#xff0c;又可以为复杂的机理过程模型大尺度模拟提供技术基础。在本次培训中&…

查询优化之单表查询

建表 CREATE TABLE IF NOT EXISTS article ( id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, author_id INT(10) UNSIGNED NOT NULL, category_id INT(10) UNSIGNED NOT NULL, views INT(10) UNSIGNED NOT NULL, comments INT(10) UNSIGNED NOT NULL, title VARBI…

Ajax和Json综合案例

1. 查询所有 创建brand.html,使用axios发送请求&#xff0c;其中查询一般采用get的请求方式 <script src"js/axios-0.18.0.js"></script><script>//1. 当页面加载完成后&#xff0c;发送ajax请求window.onload function () {//2. 发送ajax请求axi…