首页 > 其他分享 >C语言:宏定义的妙用

C语言:宏定义的妙用

时间:2023-03-10 22:32:13浏览次数:30  
标签:妙用 RETRY 定义 DO ## C语言 try event define


一、定义别名标识符

在代码中为了提高可读性,把一些数字进行宏标识化,同时也方便后续修改(一处修改,到处生效),

#define  YEAR_COUNT_SEC    (365*24*60*60)UL

二、连接符“\”

static u32 DO_AND_RETRY_try_cnt;
#define DO_AND_RETRY(func, target, try, success, fail) do { \
DO_AND_RETRY_try_cnt = (try); \
while (DO_AND_RETRY_try_cnt) \
{ \
--DO_AND_RETRY_try_cnt; \
if ((func) == target) \
{ \
success; \
break; \
} \
else \
{ \
fail; \
} \
} \
}while(0);
#define CREATE_APP(Name,Type)        \
VControl Name##Ctrl={ \
#Name, \
Type, \
0, \
0, \
0, \
Name##CmdMap, \
0, \
0, \
{0,0,0,0}, \
0 \
};

三、宏函数

/**
Get event if event type.

@param[in] e Event value.
@param[in] emin Event minimum value.
@param[in] emax Event maximum value.

@return
- @b TRUE event is between minimun and maximun
- @b FALSE event is out of range
*/
#define IN_RANGE_EVENT(e,emin,emax) (((e) > (emin)) && ((e) < (emax)))

#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))

#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))

四、字符连接与串化

字符连接:##

##操作可应用在变量定义中,若程序开发中遇到要定义一大堆变量,且这些变量具有相同的前缀时,##很显得尤为重要,它可以使代码更加整洁,且减少了出错的机率。同时,方便批量修改前缀。

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d\n", token##n)

int main(void)
{
int token34 = 40;

tokenpaster(34);
return 0;
}

输出:token34 = 40

字符串化:#

#include <stdio.h>

#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")

int main(void)
{
message_for(Carole, Debra);
return 0;
}

输出:Carole and Debra: We love you!

#操作符可用于调试时将变量名输出,可配合##一起使用,

如定义#define CHECK_VAR(x,fmt) printf(#x " = " #fmt "\n", x),则CHECK_VAR(var1,%d)相当于printf("var = %d\n", var1);

五、@# 字符化操作符

就是将参数字符化

#define toChar(x)  #@x

如果a = toChar(b),那么展开为:a = 'b';(可能早期编译器不支持)

标签:妙用,RETRY,定义,DO,##,C语言,try,event,define
From: https://blog.51cto.com/u_13472468/6113670

相关文章

  • C语言整型提升
    当定义一个char类型的数据a,给其赋值10,即chara=10;对于char类型的数据,在使用printf函数输出的时候,应该用%c,但我们想要用%d来输出类型为char的数据时,就会发生整型提升,将a由......
  • C语言之数据的存储(一)(整型数据)
    一、整型数据在内存中的存储1.1整型数据家族char,short,intlong(每种类型又分为unsigned和signed,例如,signedchar,unsignedchar)1.2整型数据的存储对于整型数据,其在计......
  • 初识C语言3/10
    循环语句:while循环:#include<stdio.h>intmain(){inti=1;while(i<=10){if(i==5)break;printf("%d\n",i);//1,2,3,4,5......
  • 自定义控件 QOpenGLWidget并实现缩放(纯代码)
    QScrollArea+QOpenGLWidget实现缩放,用于显示QImage。先自定义QOpenGLWidget,然后自定义QWidget(上图)glwidget.h#ifndefGLWIDGET_H#defineGLWIDGET_H#include<QO......
  • ORACLE自定义实现FIND_IN_SET函数
    FIND_IN_SET是mysql中的函数,见:MySQL中FIND_IN_SET函数oracle中没有FIND_IN_SET函数,oracle自定义实现FIND_IN_SET函数sql如下:--FIND_IN_SET函数CREATEORREPLACEFUN......
  • java自定义类数组的初始化
    也就是说,在声明了自定义类的数组之后,对每一个数组元素的初始化,都要为其new一个对象出来使得指针指向该对象,Java语言本身是不提供在自定义类数组声明时候自动创建新对象的方......
  • C语言基础
    C语言属于:结构化语言;一个函数包括两部分:函数首部和函数体;一个C程序的运行包括:上机编程源程序,编译源程序,进行连接处理,运行可执行程序;每个数据声明和语句的最后必须有一个......
  • java自定义注解实现字段格式化(二)
    上篇java自定义注解实现字段格式化 我们自定义了另一个浮点数格式化的注解一、格式化处理器接口但在实际生产中,处理浮点数的格式化,可能还会有其他数据的格式化,比如日期......
  • LayoutAnimationController,补间动画,属性动画,值动画,自定义动画,帧动画
    最好的代码永远是自己写出来的布局<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools......
  • spring学习48-自动装配中定义的bean的作用域
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchem......