码迷,mamicode.com
首页 > 其他好文 > 详细

glibc 中确定宏参数个数的宏__SYSCALL_NARGS 及 可变参数宏__VA_ARGS__

时间:2018-07-28 12:10:56      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:实现   代码   mac   bubuko   可变参   ram   func   类型   param   

读 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 }     

测试代码结果如下:

技术分享图片






glibc 中确定宏参数个数的宏__SYSCALL_NARGS 及 可变参数宏__VA_ARGS__

标签:实现   代码   mac   bubuko   可变参   ram   func   类型   param   

原文地址:https://www.cnblogs.com/ak47-space/p/9380535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!