网站首页 > 文章精选 正文
宏定义是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小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙
- 上一篇: C++ 第三讲 变量类型
- 下一篇: Linux网络编程(第一部分)涉及的代码
猜你喜欢
- 2025-01-05 PHP源码系列之扩展的原理与开发
- 2025-01-05 「linux」多个套接字可以绑定同一个端口吗
- 2025-01-05 基于netmap的用户态协议栈(一)
- 2025-01-05 Linux文件:超级块inode dentry file关系
- 2025-01-05 实战Netty!基于私有协议,怎样快速开发网络通信服务
- 2025-01-05 char, unsigned char,之间的相互转换
- 2025-01-05 PHP 扩展与 ZEND 引擎的整合
- 2025-01-05 C语言:位域和字节序
- 2025-01-05 Nor Flash的两种规范
- 2025-01-05 「技术干货」Ip头udp数据包ARP协议(代码实现netmap)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)