宏定义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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。