网站首页 > 技术文章 正文
宏定义是c语言预处理中的一部分,合理地使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。嵌入式软件开发时,经常使用到宏定义提高程序的运行速度。今天主要是介绍以下常用的宏定义内容,并用实际的程序运行。
1.C语言常用的宏定义
- /*求两个数据的最大值*/
- /*求两个数据的最小值*/
- /*ABS(A,B) = |A-B|*/
- /*求数组元素的个数*/
- /*判断字符是不是10进制的数字*/
- /*判断字符是不是16进制的数字*/
- /*将一个字母转换为大写*/
- /*将一个字母转换为小写*/
- /*获取u16类型的低8位(低字节)*/
- /*获取u16类型的高8位(高字节)*/
- /*获取数据某位*/
- /*设置某位为1 (num| = (1UL<<bit))*/
- /*设置某位为0 (num&=~(1UL<<bit))*/
#define MAX_NUM(a,b) ((a)>(b)?(a):(b)) /*求两个数据的最大值*/
#define MIN_NUM(a,b) ((a)<(b)?(a):(b)) /*求两个数据的最小值*/
#define ABS(a,b) ((a)>(b)?(a-b):(a-b)) /*ABS(A,B) = |A-B|*/
#define ARR_SIZE(arr) ((sizeof(arr)/(sizeof((arr)[0]))) /*返回数组元素的个数*/
#define DECCHK(c) ((c) >= '0' && (c) <= '9') /*判断字符是不是10进制的数字*/
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||((c) >= 'A' && (c) <= 'F') ||((c) >= 'a' && (c) <= 'f') )
/*判断字符是不是16进制的数字*/
#define UPCASE(c) (((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) ) /*将一个字母转换为大写*/
/* a: ASCII 0x61H A: ASCII 0x41H a-A = 0x20*/
#define LOWCASE(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) + 0x20) : (c) ) /*将一个字母转换为小写*/
#define UINT16_LOW(A) ((A)&(0xFF)) /*获取u16类型的低8位(低字节)*/
#define UINT16_HIGH(A) ((A)>>8) /*获取u16类型的高8位(高字节)*/
#define GETNUMBIT(num,bit) ((num>>bit)&0x01) /*获取数据某位*/
#define SETNUMBIT(num,bit) (num|= 1UL<<bit) /*设置某位为1 (num| = (1UL<<bit))*/
#define CLEARNUMBIT(num,bit) (num&=~(1UL<<bit))
2.实例程序
主程序
#include <stdio.h>
#include "Commonhead.h"
int main()
{
u08 uca = 5;
u08 ucb = 10;
u08 ucc = 3;
u16 arr[8] = {2,5,2,0,1,3,1,4};
u08 i = 0;
u08 len = 0;
u08 ucd = 5;
u08 ucdresult = 0;
u16 uce = 520;/*0000 0010 0000 1000*/
printf("a = %d b = %d c = %d\n",uca,ucb,ucc);
printf("MIN(a,b) = %d\n",MIN_NUM(uca,ucb));
printf("MIN(a,b,c) = %d\n",MIN_NUM(MIN_NUM(uca,ucb),ucc));
printf("MAX(a,b) = %d\n",MAX_NUM(uca,ucb));
printf("MAX(a,b,c) = %d\n",MAX_NUM(MAX_NUM(uca,ucb),ucc));
printf("ABS(a,b) = %d\n",ABS(uca,ucb));
for(i = 0; i < 8; i++)
{
printf("arr[%d] = %d\n",i+1,arr[i]);
}
printf("\n");
for(i = 0; i < ARR_SIZE(arr)); i++)
{
printf("arr[%d] = %d\n",i+1,arr[i]);
}
printf("\n");
ucdresult = GETNUMBIT(ucd,2);/*下标从0开始 低*/
printf("%d\n",GETNUMBIT(ucd,2));
printf("%d\n",ucdresult);
printf("Num = %d Setresult = %d\n",ucd,SETNUMBIT(ucd,3));
ucd = 5;
printf("Num = %d Setresult = %d\n",ucd,CLEARNUMBIT(ucd,2));
printf("Setresult = %d\n",CLEARNUMBIT(uca,2));
printf("520 High Byte = %d \n",UINT16_HIGH(uce));/*2 0000 0010*/
printf("520 Low Byte = %d \n",UINT16_LOW(uce)); /*8 0000 1000*/
getchar();
return 0;
}
头文件
#ifndef _COMMONHEAD_H /*防止头文件重复定义*/
#define _COMMONHEAD_H
/*无符号类型自定义*/
typedef unsigned long int u64;
typedef unsigned int u32;
typedef unsigned short int u16;
typedef unsigned char u08;
/*常用宏定义*/
/*C语言中的三目运算符是:“?:”。
三目运算符连接三个对象,是C语言中唯一一个三目运算符,又称为条件运算符。
它的一般形式是:【表达式a?表达式b:表达式c】。
执行步骤如下:
1、计算表达式a的值;
2、如果表达式a的值为1,则执行表达式b;
3、如果表达式b的值为0,则执行表达式c;*/
#define MAX_NUM(a,b) ((a)>(b)?(a):(b)) /*求两个数据的最大值*/
#define MIN_NUM(a,b) ((a)<(b)?(a):(b)) /*求两个数据的最小值*/
#define ABS(a,b) ((a)>(b)?(a-b):(a-b)) /*ABS(A,B) = |A-B|*/
#define ARR_SIZE(arr) ((sizeof(arr)/(sizeof((arr)[0]))) /*返回数组元素的个数*/
#define DECCHK(c) ((c) >= '0' && (c) <= '9') /*判断字符是不是10进制的数字*/
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||((c) >= 'A' && (c) <= 'F') ||((c) >= 'a' && (c) <= 'f') )
/*判断字符是不是16进制的数字*/
#define UPCASE(c) (((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) ) /*将一个字母转换为大写*/
/* a: ASCII 0x61H A: ASCII 0x41H a-A = 0x20*/
#define LOWCASE(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) + 0x20) : (c) ) /*将一个字母转换为小写*/
#define UINT16_LOW(A) ((A)&(0xFF)) /*获取u16类型的低8位(低字节)*/
#define UINT16_HIGH(A) ((A)>>8) /*获取u16类型的高8位(高字节)*/
#define GETNUMBIT(num,bit) ((num>>bit)&0x01) /*获取数据某位*/
#define SETNUMBIT(num,bit) (num|= 1UL<<bit) /*设置某位为1 (num| = (1UL<<bit))*/
/*
num = 5 bin 0000 0101 设置第4位为1 num| = 0000 0101 << 4 -> 0000 1101 dec:13
1UL<<4 0000 0000 0000 0000 0000 0000 0000 0001<<4 -> 0000 0000 0000 0000 0000 0000 0000 1000
num|1UL = 0000 0000 0000 0000 0000 0000 0000 0101|0000 0000 0000 0000 0000 0000 0000 1000 = u08 0000 1101
*/
#define CLEARNUMBIT(num,bit) (num&=~(1UL<<bit))
/*
num = 5 bin 0000 0101 设置第3位为0 num& = ~(0000 0101 << 3) -> 0000 0001 dec:1
1UL<<3 0000 0000 0000 0000 0000 0000 0000 0001<<3 -> 0000 0000 0000 0000 0000 0000 0000 0100
~1UL<<3 1111 1111 1111 1111 1111 1111 1111 1011
num& = ~1UL<<3 0000 0101 & 1111 1111 1111 1111 1111 1111 1111 1011 ->
0000 0000 0000 0000 0000 0000 0000 0001
*/
#endif
运行结果
a = 5 b = 10 c = 3
MIN(a,b) = 5
MIN(a,b,c) = 3
MAX(a,b) = 10
MAX(a,b,c) = 10
ABS(a,b) = -5
arr[1] = 2
arr[2] = 5
arr[3] = 2
arr[4] = 0
arr[5] = 1
arr[6] = 3
arr[7] = 1
arr[8] = 4
arr[1] = 2
arr[2] = 5
arr[3] = 2
arr[4] = 0
arr[5] = 1
arr[6] = 3
arr[7] = 1
arr[8] = 4
1
1
Num = 13 Setresult = 13
Num = 1 Setresult = 1
Setresult = 1
520 High Byte = 2
520 Low Byte = 8
A
参考内容
[1] 知乎作者C语言编程俱乐部的文章《【C语言宏定义】来,看看这20个常用的宏定义!》,https://zhuanlan.zhihu.com/p/386794142。
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙
猜你喜欢
- 2024-09-12 c++ printf 到 std::cout(c++怎么用printf输出整数)
- 2024-09-12 C 语言未初始化的局部变量是多少?
- 2024-09-12 大话C语言:函数(c语言函数视频讲解)
- 2024-09-12 每日一题||C语言刷题(c语言刷题网)
- 2024-09-12 大话C语言:逗号运算符及运算法优先级
- 2024-09-12 C语言学习篇(14)-----sizeof运算符
- 2024-09-12 C语言 include的用法(c语言include的用法与搭配)
- 2024-09-12 C语言的位运算基本操作演示(c语言位运算的运算规则)
- 2024-09-12 编写一个C程序,输入a,b,c三个值,输出其中最大值
- 2024-09-12 C语言如何实现大数相加(c语言大数相加思路)
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1523℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 655℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 527℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 461℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 460℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)