glibc 中确定宏参数个数的宏__SYSCALL_NARGS 及 可变参数宏__VA_ARGS__
Posted ak47-space
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了glibc 中确定宏参数个数的宏__SYSCALL_NARGS 及 可变参数宏__VA_ARGS__相关的知识,希望对你有一定的参考价值。
读 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 ", paramCnt1); | ~ 17 printf("param cnt2:%d ", paramCnt2); | ~ 18 printf("param cnt3:%d ", paramCnt3); | ~ 19 printf("param cnt4:%d ", paramCnt4); | ~ 20 | ~ 21 return 0; | ~ 22 }
测试代码结果如下: