资讯详情

C语言中##的用法

今天看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<cstdio> #include<climits> 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<climits> 输出为:intmax:0x7fffffff ST

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

锐单商城 - 一站式电子元器件采购平台