读 glibc 中 关于 socket 系统调用实现的部分,然后看到了这里,写在这里做份一份笔记。
#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n #define __SYSCALL_NARGS(...) \ __SYSCALL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,) #define __SYSCALL_CONCAT_X(a,b) a##b #define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X (a, b) #define __SYSCALL_DISP(b,...) \ __SYSCALL_CONCAT (b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
__VA_ARGS__ 代表首层的所有的宏参数,在 __SYSCALL_NARGS_X 中做参数替换,而 __SYSCALL_NARGS_X 通过额外增加参数(7,6,5,4,3,2,2,0,)来确定
__VA_ARGS__ 中究竟传进来多少个参数,从而拼接出究竟要调用哪一个类型的函数 测试代码如下
1 #include <stdio.h> | " Press <F1> to display hel 2 | 3 #define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n |- var_num_macro.c (/home/sunz 4 #define __SYSCALL_NARGS(...) \ ||- macro 5 __SYSCALL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,) ||| __SYSCALL_NARGS_X 6 ||| __SYSCALL_NARGS 7 || 8 ||- function 9 int main(int argc,char* argv[]){ ||| main 10 | 11 int paramCnt1 = __SYSCALL_NARGS(1); | ~ 12 int paramCnt2 = __SYSCALL_NARGS(1,2); | ~ 13 int paramCnt3 = __SYSCALL_NARGS(1,2,3); | ~ 14 int paramCnt4 = __SYSCALL_NARGS(1,2,3,4); | ~ 15 | ~ 16 printf("param cnt1:%d\n", paramCnt1); | ~ 17 printf("param cnt2:%d\n", paramCnt2); | ~ 18 printf("param cnt3:%d\n", paramCnt3); | ~ 19 printf("param cnt4:%d\n", paramCnt4); | ~ 20 | ~ 21 return 0; | ~ 22 }
测试代码结果如下:
原文地址:https://www.cnblogs.com/ak47-space/p/9380535.html
时间: 2024-10-10 23:47:16