关键词不能为空

当前您在: 主页 > 英语 >

C语言宏中#和##的用法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-09 22:25
tags:

-

2021年2月9日发(作者:三千)


C


语言宏中





的用法





在查看


linux

< br>内核源码的过程中,遇到了许多宏,这里面有许多都涉及到





,因此,


在网上搜索了一些资料, 整理如下:




一、一般用法



我们使用


#


把宏参数变为一个字符串


,



##


把两个宏参数贴合在一起< /p>


.



用法


:




include




include



using namespace std;




#define STR(s)






#s



#define CONS(a,b)



int(a##e##b)




int main()



{







printf(STR(vck));












//


输出字符串








printf(



// 2e3


输出


:2000







return 0;



}




二、当宏参数是另一个宏的时候



< /p>


需要注意的是凡宏定义里有用


'#'


或< /p>


'##'


的地方宏参数是不会再展开


.




1,



'#'



'##'

的情况




#define TOW







(2)



#define MUL(a,b) (a*b)




printf(



这行的宏会被展开为:




printf(



MUL


里的参数


TOW


会被展开为


(2).




2,


当有


'#'



'##'


的时候




#define A











(2)



#define STR(s)






#s



#define CONS(a,b)



int(a##e##b)




printf(



STR(INT_MAX));





// INT_MAX



include



这行会被展开为:




printf(




printf(
















// compile error




这一行则是:




printf(



< br>INT_MAX



A


都不会再被 展开


,


然而解决这个问题的方法很简单


.


加多一层中间转换宏


.



加这层宏的用意是把所有宏的参数在这层里全部展开


,


那么在转换宏里的那一个宏


(_STR)


就能 得到正确的宏



参数


.




#define A












(2)



#define _STR(s)






#s



#define STR(s)







_STR(s)











//


转换宏




#define _CONS(a,b)



int(a##e##b)



#define CONS(a,b)




_CONS(a,b)








//


转换宏





printf(











// INT_MAX,int


型的最大值,


为一个变量




include



输出为


: int max: 0x7fffffff



STR(INT_MAX) -->



_STR(0x7fffffff)


然后再转换成字符串;





printf(



输出为:


200



CONS(A, A)



-->



_CONS((2), (2))



--> int((2)e(2))




三、


'#'



'##'


的一些应用特例




1


、合并匿名变量名




#define



___ANONYMOUS1(type, var, line)



type



var##line



#define



__ANONYMOUS0(type, line)



___ANONYMOUS1(type, _anonymous, line)



#define



ANONYMOUS(type)



__ANONYMOUS0(type, __LINE__)



例:


ANONYMOUS(static int);




: static int _anonymous70;



70


表示该行行号;




第一层:


ANONYMOUS(static int);



-->



__ANONYMOUS0(static int, __LINE__);



第二层:


























-->



___ANONYMOUS1(static int, _anonymous, 70);



第三层:


























-->



static int



_anonymous70;



即每 次只能解开当前层的宏,所以


__LINE__


在第二层才能被 解开;





2


、填充结构




#define



FILL(a)




{a, #a}




enum IDD{OPEN, CLOSE};



typedef struct MSG{





IDD id;





const char * msg;



}MSG;




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


-


-


-


-


-


-


-


-



本文更新与2021-02-09 22:25,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/624430.html

C语言宏中#和##的用法的相关文章

  • 爱心与尊严的高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊严高中作文题库

    1.关于爱心和尊严的作文八百字 我们不必怀疑富翁的捐助,毕竟普施爱心,善莫大焉,它是一 种美;我们也不必指责苛求受捐者的冷漠的拒绝,因为人总是有尊 严的,这也是一种美。

    小学作文
  • 爱心与尊重的作文题库

    1.作文关爱与尊重议论文 如果说没有爱就没有教育的话,那么离开了尊重同样也谈不上教育。 因为每一位孩子都渴望得到他人的尊重,尤其是教师的尊重。可是在现实生活中,不时会有

    小学作文
  • 爱心责任100字作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任心的作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文
  • 爱心责任作文题库

    1.有关爱心,坚持,责任的作文题库各三个 一则150字左右 (要事例) “胜不骄,败不馁”这句话我常听外婆说起。 这句名言的意思是说胜利了抄不骄傲,失败了不气馁。我真正体会到它

    小学作文