当前位置:   article > 正文

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

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

1. 前言

# :把宏参数变为一个字符串,

##:把两个宏参数贴合在一起.

2. 一般用法

#include<stdio.h>

#define toString(str) #str //转字符串

#define conStr(a,b) (a##b)//连接

int main()

{

    printf(toString(12345)):        //输出字符串"12345

    printf("\n%d\n",conStr(1, 3));  //输出int 13

    return 0;

}

3. 注意事项

当一个宏的传入参数是另一个宏的时候,需要注意的是凡宏定义里有用#或##的地方,作为参数的那个宏是不会再展开的,即,只有当前宏生效, 参数里的宏!不!会!生!效!!!!

3.1 举例

#include<stdio.h>

#define toString(str) #str //转字符串

#define conStr(a,b) (a##b)//连接

#define AGE 18

int main(void)

{

    printf("str is:%s", toString(AGE)); //输出字符串“AGE”而不是18

    //printf("\n%s",conStr(AGE,AGE)); //语法错误 --- AGEAGE未申明的标识符

    return 0;

}

两句print会被展开为:

    printf("str is:%s", "AGE");

    printf("\n%s",AGEAGE);

分析: 
由于AGE是宏,且作为宏toString和conStr的参数,并且宏conStr和toString中均含有#或者##符号,所以AGE不能被再次展开。导致不符合预期的情况出现。

3.2 解决方案

解决这个问题的方法很简单,多加一层中间转换宏。

加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里就会先得到宏参数的值,然后再传递给后续的宏

#include<stdio.h>

#define _toString(str) #str //转字符串

#define toString(str)  _toString(str)

#define _conStr(a,b) (a##b)//连接

#define conStr(a,b) _conStr(a,b)

#define AGE 18

结果:

printf('str is:%s', toString(AGE))

//输出为: str is: 18

//toString(AGE) -> _toString(18) ->"18”

printf("n%d",conStr(AGE, AGE));

//输出为1818

//conStr(AGE,AGE) -> conStr(18,18) ->1818

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/206343
推荐阅读
相关标签
  

闽ICP备14008679号