C语言宏使用

news/2024/11/29 22:39:59/

C语言宏

编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是宏发挥作用的阶段,编译完之后宏对二进制代码不可见。

使用

1. 宏常量
#define PI 3.14
2. 宏语句
#define Print printf("hello,world!\r\n")
3. 宏函数

使用宏来定义函数,宏可以带参数

#define Print(str) printf("%s",str)
4. 相关作用符
  • 换行符\

    多行语句时,可以在末尾添加\代表换行

    #define Print printf("第一行"); \printf("第二行")
    
  • 字符串化符#

    #是字符串化的意思,将出现在宏定义中的#后面的参数转换为一个字符串

    #define Print(str) printf(#str"的值是%d",str)
    
  • 片段连接符##

    ##是分隔连接方式,作用是先分隔,然后进行强制连接。在普通的宏定义中,预处理器一般把空格解释为分段标志,对于每一段和前面比较,相同的就进行替换,会导致替换段之间存在一些空格,可以使用##替换空格分隔符

    #define add(n,value) num##n += vlaue// add(2,10); 等价于num2 += 10, 将num和2连接成了num2
    

技巧

  • 类型传递

    宏函数可以传递参数类型

    #define Malloc(type,size) (type *) malloc(sizeof(type) * size)int *p = Malloc(int,100);
    
  • 传递数组

    使用数组作为函数参数传递时,无法通过sizeof()获取其数组的大小,通常需要传递数组的大小信息。

    使用宏可以不传递大小

    #define InsertSort(list) \
    { 								 \int size = sizeof(list)/4;   \// ...                       \
    }InsertSort(num);
    

使用场景

调试过程使用

#include <stdio.h>#define DEBUG	1
#ifdef DEBUG 
#define PRINT(fmt,value)  \printf("[FILE: %s][FUNC:%s][LINE:%d]-->" #value "=" fmt "\r\n",  \__FILE__,__FUNCTION__,__LINE__,value	      \
)
#else
#define PRINT(fmt,value)
#endifint main(){int c = 1;int d = 2;PRINT("%d",c);PRINT("%d",d);return 0;
} 

在这里插入图片描述


http://www.ppmy.cn/news/60749.html

相关文章

ARM协处理器指令

ARM微处理器可支持多达16个协处理器&#xff0c;用于各种协处理操作&#xff0c;在程序执行的过程中&#xff0c;每个协处理器只执行针对自身的协处理指令&#xff0c;忽略ARM处理器和其他协处理器的指令。 ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作…

行业常识_RFID

文章目录 1 RF2 RFID2.1 RFID的应用场景2.2 RFID工作原理 1 RF RF&#xff0c;是Radio Frequency的缩写&#xff0c; Radio&#xff0c;n. 收音机&#xff1b;无线电通讯&#xff1b; v. 用无线电通讯&#xff08;或发送消息&#xff09; Frequency&#xff0c;n. 频率 RF中文…

Nessus漏洞扫描以及OpenSSH漏洞修复验证

主机IP地址资源kali192.168.200.1285GB内存/4CPUCentOS7.5192.168.200.1292GB内存/2CPU https://www.tenable.com/downloads/nessus?loginAttemptedtrue curl --request GET \--url https://www.tenable.com/downloads/api/v2/pages/nessus/files/Nessus-10.5.1-ubuntu1404_am…

【code review】代码评审的18个军规(建议收藏)

文章目录 背景1. 添加必要的注释2.日志打印规范3. 命名规范4.参数校验5. 判空处理6. 异常处理规范7. 模块化&#xff0c;可扩展性8. 并发控制规范9. 单元测试规范10. 代码格式规范11. 接口兼容性12. 程序逻辑是否清晰,主次是否够分明13. 安全规范14. 事务控制规范15. 幂等处理规…

Java连接顺丰开放平台

今天使用Java去访问顺丰的开放平台时&#xff0c;JSON转换一直不成功&#xff0c;最终发现是 可以看到这里是 "apiResultData": "{\"success\": .........它是以 " 开头的&#xff01;&#xff01;&#xff01;如果是对象的话&#xff0c;那么…

2023年全国最新安全员精选真题及答案65

百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 41.脚手架采用的扣件&#xff0c;在螺栓拧紧力矩达&#xff08;&#xff09;NM时&…

命令设计模式

命令模式 命令模式定义:使用场景1、遥控器&#xff1a;遥控器是一种典型的命令模式应用&#xff0c;遥控器中的每一个按钮都对应着一个命令对象&#xff0c;当用户按下按钮时&#xff0c;遥控器会发送相应的命令对象给电器&#xff0c;电器会根据命令对象来执行相应的操作。2、…

【代码随想录】刷题Day15

1.层序遍历 102. 二叉树的层序遍历 1.首先层序遍历是通过队列结构实现的 2.其实就是循环将每一层节点入队列&#xff0c;随后出队列将数据存储起来。通过出队列的节点&#xff0c;将其左右节点&#xff0c;也就是再把下一层的节点入队列。那么我们就能得到层序遍历的结果了 3.…