网站首页 > 技术文章 正文
宏定义是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语言大数相加思路)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)