锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

C语言中##的用法

时间:2024-04-29 22:07:10

今天看linux操作系统源码是有这么一段:
#define _syscall0(type,name) \ type name(void) \ { \ long __res; \ __asm__ volatile ( "int $0x80" \ // 调用系统中断0x80。 :"=a" (__res) \ // 返回值??eax(__res)。 :"" (__NR_ ##name)); \ // 输入为系统中断调用号__NR_name。 if (__res >= 0) \ // 如果返回值>=0,则直接返回该值。 return (type) __res; errno = -__res; \ // 否则置出错号,并返回-1。 return -1;}
其中有一个地方出现了两个‘#’号不明白什么意思,网上找到了一段论坛:
 宏中"#"和"##"的用法

一、一般用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
用法:
#include
#include
usingnamespacestd;

#defineR(s)#s
#defineCS(a,b)int(a##e##b)

intmain()
{
printf(STR(vck));//输出字符串"vck"
printf("%d
",CONS(2,3));//2e3输出:2000
return0;
}

二、当宏参数是另一个宏的时候
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开.

1,非'#'和'##'的情况
#defineTOW(2)
#defineMUL(a,b)(a*b)

printf("%d*%d=%d
",TOW,TOW,MUL(TOW,TOW));
这行的宏会被展开为:
printf("%d*%d=%d
",(2),(2),((2)*(2)));
MUL里的参数TOW会被展开为(2).

2,当有'#'或'##'的时候
#defineA(2)
#defineSTR(s)#s
#defineCONS(a,b)int(a##e##b)

printf("intmax:%s
",STR(I_MAX));//INT_MAX#include
这行会被展开为:
printf("intmax:%s
","INT_MAX");

printf("%s
",CONS(A,A));//compileerror
这一行则是:
printf("%s
",int(AeA));

INT_MAX和A都不会再被展开,然而解决这个问题的方法很简单.加多一层中间转换宏.
加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.

#defineA(2)
#define_STR(s)#s
#defineSTR(s)_STR(s)//转换宏
#define_CONS(a,b)int(a##e##b)
#defineCONS(a,b)_CONS(a,b)//转换宏

printf("intmax:%s
",STR(INT_MAX));//INT_MAX,int型的最大值,为一个变量#include
输出为:intmax:0x7fffffff
ST

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章