宏定义c++语言,C语言宏的用法

  宏定义c++语言,C语言宏的用法

  c语言博大精深,每一个细节都包含很多技术特征。我相信C程序员的同行在第一次遇到“#”、“# @”、“# #”这样的技能时,都是无所适从的。本文总结了在宏定义中使用 # 、 # @ 和 # # 的技巧,在网上搜集!供需要时参考,并希望对其他同行有所帮助。

  一.一般用法

  #将宏参数改为字符串,# @将宏参数改为字符,# #将两个宏参数粘贴在一起。

  #包含stdio.h

  #包括限额. h

  # define STR # s//#和参数之间可以有空格。

  #define TOCHAR(c) #@c

  # definecons (a,b) int (a # # e # # b)//# #和参数之间可以有空格。

  int main(void)

  {

  printf(STR(Pele));//输出字符串“pele”

  printf(%c\n ,TOCHAR(z));//输出字符z

  printf(%d\n ,CONS(2,3));//2e3输出:2000

  返回0;

  }

  第二,当宏参数是另一个宏时

  需要注意的是,宏定义中 # 或 # # 有用的宏参数将不再展开。

  #定义一个(2)

  #定义字符串#s

  #定义CONS(a,b) int(a##e##b)

  printf(int max: %s\n ,STR(INT _ MAX));

  该公会将扩展为:

  printf(int max: %s\n , INT _ MAX );

  printf(%s\n ,CONS(A,A));

  这一行扩展到:

  printf(%s\n ,int(AeA));

  INT_MAX和a都不会再展开。不过这个问题的解决方法很简单,增加一层额外的中间转换宏。添加这个宏的目的是展开该层的所有宏参数,使转换宏中的宏(_STR)能够得到正确的宏参数。

  #定义一个(2)

  # define _ STR # s

  # define STR _ STR//转换宏

  #define _CONS(a,b) int(a##e##b)

  #定义CONS(a,b) _CONS(a,b) //转换宏

  printf(int max: %s\n ,STR(INT _ MAX));

  输出:int max:0x7fffffff

  STR(INT _ MAX)-_ STR(0x 7 fffffff)-0x 7 fffffff

  printf(%d\n ,CONS(A,A));

  产量:200

  CONS(A,A) - _CONS((2),(2)) - int((2)e(2))

  以下是与Minix操作系统相关的源代码:

  #ifdef _ANSI

  #define __str(x) # x

  #define __xstr(x) __str(x) //转换宏

  _PROTOTYPE( void __bad_assertion,(const char * _ mess));

  #define assert(expr)((expr)?(void)0 : \

  _ _ bad _ Assertion( Assertion # expr \

  “”失败,文件“__xstr(__FILE__) \

  ,line __xstr(__LINE__) \n ))

  三。“#”和“# #”的一些应用示例

  1.合并匿名变量名。

  #define ___ANONYMOUS1(type,var,line) type var##line

  #define __ANONYMOUS0(type,line)_ANONYMOUS 1(type,_ anonymous,line)

  # define ANONYMOUS(type)_ _ ANONYMOUS 0(type,__LINE__)

  例如:ANONYMOUS(static int);即静态int _ anonymous7070表示该行的行号;

  一楼:匿名(静态int);- __ANONYMOUS0(staticint,_ _ LINE _ _);

  二楼:-_ _ _匿名1(静态int,_匿名,70);

  第三层:-static int _ anonymous 70;

  即一次只能解锁当前层的宏,所以__LINE__只能在第二层解锁;

  2.填充结构

  #定义填充(a) {a,#a}

  枚举IDD{OPEN,CLOSE}。

  typedef结构消息

  {

  IDD id

  const char * msg

  } MSG

  MSG _msg[]={FILL(OPEN),FILL(CLOSE)};

  相当于:

  MSG _ MSG[]={ {打开,打开 },{关闭,关闭 } };

  3.记录文件名

  #define _GET_FILE_NAME(f) #f

  # define get _ file _ name(f)_ get _ file _ name(f)//转换宏

  静态字符文件名[]=获取文件名(__文件_ _);

  4.获取对应于数字类型的stringbuffer大小。

  # define _ TYPE _ BUF _ SIZE(TYPE)SIZE of # TYPE

  # define TYPE _ BUF _ SIZE(TYPE)_ TYPE _ BUF _ SIZE(TYPE)

  char BUF[TYPE _ BUF _ SIZE(INT _ MAX)];

  -charbuf[_ TYPE _ BUF _ SIZE(0x 7 fffffff)];

  -charbuf[sizeof 0x 7 ffffff ];

  这相当于:

  char buf[11];

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: