程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

嵌入式软件开发时常用的宏定义汇总

balukai 2025-01-05 15:44:20 文章精选 13 ℃

宏定义是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小时内删除。


作 者 | 郭志龙

编 辑 | 郭志龙
校 对 | 郭志龙

最近发表
标签列表