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 }     

测试代码结果如下:

技术分享图片













以上是关于glibc 中确定宏参数个数的宏__SYSCALL_NARGS 及 可变参数宏__VA_ARGS__的主要内容,如果未能解决你的问题,请参考以下文章

高分求助VC中关于不定参数宏的使用

12_关于flask中的宏

__VA_ARGS__可变参数宏

__VA_ARGS__和va_start作用, 关于log

C语言便于调试的宏定义 __FILE____FUNCTION____LINE____VA_ARGS__ 参数使用

C/C++中关于宏定义中使用 # 和 ## 的作用