C语言中宏定义"#"和"##"符号的用法

来源:本站
导读:目前正在解读《C语言中宏定义"#"和"##"符号的用法》的相关信息,《C语言中宏定义"#"和"##"符号的用法》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《C语言中宏定义"#"和"##"符号的用法》的详细说明。
简介:本篇文章详细介绍C语言中宏定义"#"和"##"符号的用法,希望对大家的C语言学习有所帮助。

C语言中宏有两个非常有用的宏符号“#”,“##”这两个符号的用法总结如下。

#把宏参数变为一个字符串,而##把两个宏参数贴合在一起。

一、一般用法:

#include<stdio.h>

#defineSTR(s)#s

#defineCONSS(a,b)(int)a##e##b

intmain()

{

printf(STR(vck));//输出字符串"vck"

printf("n");

printf("%dn",CONSS(2,3));//2e3输出:2000

return0;

}

二、宏参数是另一个宏

1、非’#’和’##’的情况:

#include<stdio.h>

#defineTOW(2)

#defineMUL(a,b)(a*b)

intmain()

{

printf("%d*%d=%dn",TOW,TOW,MUL(TOW,TOW));

return0;

}

展开的结果是:

printf("%d*%d=%dn",(2),(2),((2)*(2)));

所以:没有使用#符号时,会递归的全部展开。

2、当有’#’或’##’的时候

需要注意的是凡宏定义里有用’#’或’##’的地方宏参数是不会再展开。如下:

#include<stdio.h>

#defineINT_MAX0x7fffffff

#defineSTR(s)#s

intmain()

{

printf("intmax:%sn",STR(INT_MAX));//输出:intmax:INT_MAX

printf("intmax:%dn",INT_MAX);//输出:intmax:2147483647

return0;

}

如果定义:

#include<stdio.h>

#defineA(2)

#defineCONSS(a,b)(int)a##e##b

intmain()

{

printf("%dn",CONSS(A,A));

return0;

}

则编译时会报错,因为无法将A展开,所以(int)(2)e(2)会出错。

解决办法:加多一层中间转换宏。加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏就能得到正确的宏参数。

#include<stdio.h>

#defineA2

#define_STR(s)#s

#defineSTR(s)_STR(s)//转换宏

#define_CONSS(a,b)(int)a##e##b

#defineCONSS(a,b)_CONSS(a,b)//转换宏

intmain()

{

printf("%dn",CONSS(A,A));

printf("%dn",STR(A));

return0;

}

三、’#’和’##’的一些应用特例

1、合并匿名变量名

#define___ANONYMOUS1(type,var,line)typevar##line

#define__ANONYMOUS0(type,line)___ANONYMOUS1(type,_anonymous,line)

#defineANONYMOUS(type)__ANONYMOUS0(type,__LINE__)

例:ANONYMOUS(staticint);即:staticint_anonymous70;70表示该行行号;

第一层:ANONYMOUS(staticint);-->__ANONYMOUS0(staticint,__LINE__);

第二层:-->___ANONYMOUS1(staticint,_anonymous,70);

第三层:-->staticint_anonymous70;

即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开;

2、填充结构

#defineFILL(a){a,#a}

enumIDD{OPEN,CLOSE};

typedefstructMSG{

IDDid;

constchar*msg;

}MSG;

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

相当于:

MSG_msg[]={{OPEN,"OPEN"},

{CLOSE,"CLOSE"}};

3、记录文件名

#define_GET_FILE_NAME(f)#f

#defineGET_FILE_NAME(f)_GET_FILE_NAME(f)

staticcharFILE_NAME[]=GET_FILE_NAME(__FILE__);

4、得到一个数值类型所对应的字符串缓冲大小

#include<stdio.h>

#defineINT_MAX0x7fffffff

#define_TYPE_BUF_SIZE(type)sizeof#type

#defineTYPE_BUF_SIZE(type)_TYPE_BUF_SIZE(type)

intmain()

{

printf("%dn",TYPE_BUF_SIZE(INT_MAX));//11

return0;

}

相当于:

TYPE_BUF_SIZE(INT_MAX)—>_TYPE_BUF_SIZE(0x7fffffff)—>sizeof"0x7fffffff";

提醒:《C语言中宏定义"#"和"##"符号的用法》最后刷新时间 2024-03-14 00:59:08,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《C语言中宏定义"#"和"##"符号的用法》该内容的真实性请自行鉴别。