#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

