C语言宏定义中#和##运算符

来源:互联网 发布:ubuntu镜像文件 编辑:程序博客网 时间:2024/06/02 02:44

宏定义可以包含两个专用的运算符:#和##

1, #运算符

#运算符将宏的一个参数转换为字符串字面量,所执行的操作可以理解为“字符串化”。它仅允许出现在带参数的宏的替换列表中。举个例子

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

n之前的#运算符通知预处理器根据PRINT_INT的参数创建一个字符串字面量,因此

    PRINT_INT(i/j);

会变为

    printf("i/j" " = %d\n", i/j);

根据C语言的规则:当两条或更多条字符串字面量相邻时(仅用空白字符分割),编译器会把它们合并成一条字符串
以上的语句等价于:

    printf("i/j = %d\n", i/j);

2. ##运算符

##运算符可以将两个记号(如标识符)“粘合”在一起,成为一个记号。如果其中一个参数是宏参数,“粘合”会在形式参数被相应的实际参数替换后发生。考虑下面的宏:

    #define MK_ID(n) i##n

当MK_ID被调用时

    int MK_ID(1);

预处理后,这一声明变为

    int i1;

3. 在u-boot中的应用

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}

则下面的定义

    U_BOOT_CMD(HelloWorld, 3, 1, HelloWorld_Cmd, "Print Hello World", "Just a Test");

预编译后变为

cmd_tbl_t __u_boot_cmd_HelloWorld Struct_Section = {"HelloWorld", 3, 1, HelloWorld_Cmd, "Print Hello World", "Just a Test"};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机6s屏幕坏了怎么办 苹果6s屏幕摔坏了怎么办 苹果手机屏幕进油了屏幕变暗怎么办 苹果手机不小心屏幕进油了怎么办 苹果6充电插口螺丝口坏了怎么办 苹果5s手机安装屏幕翘边怎么办 苹果手机摔了一下触摸屏失灵怎么办 苹果手机摔了下触摸屏失灵怎么办 苹果6老是屏幕失灵或者闪屏怎么办 华为荣耀8手触摸屏乱跳失灵怎么办 苹果5s屏幕有半边竖纹怎么办 苹果5s电源键坏了怎么办 苹果6s手机触屏失灵怎么办 不能取电池的手机触屏不灵怎么办? 7p主板触摸ic坏了怎么办 小米六手机摔了一下屏幕失灵怎么办 魅蓝5s触屏失灵怎么办 苹果手机键盘字母顺序乱了怎么办 红米手机进水后屏幕失灵怎么办 苹果7plus主屏按键坏了怎么办 苹果六手机上的红色变成粉色怎么办 苹果手机出现闪屏和手感不灵怎么办 荣耀6plus后开不了机怎么办 苹果手机touch id密码忘了怎么办 苹果7摔出了一个裂缝怎么办 屏幕摔坏了下键盘失灵怎么办 苹果4s手机按健失灵怎么办 金立手机摔了一下黑屏了怎么办 苹果5s屏幕不亮了怎么办 苹果6s手机开不了机怎么办 苹果手机充电的地方坏了怎么办 手机丢了只有imei码该怎么办 在保修期的苹果被偷了怎么办 苹果手机在保修期之外坏了怎么办 把苹果售后给的备用机摔了怎么办 把售后给的备用机摔坏了怎么办 苹果4s屏幕玻璃碎了怎么办 苹果手机摔鼓起来了屏幕花了怎么办 苹果8卡屏幕划不动了怎么办 苹果x卡屏幕划不动了怎么办 苹果5s解锁密码忘了怎么办