c c 計算可變引數巨集 VA ARGS

2021-08-20 21:14:04 字數 2417 閱讀 7935

如何計算可變引數__va_args__中的引數個數?

google上找了一下,網上答案不少,仔細看看原理都是一樣的,比如這篇stackoverflow上的問題,給出的答案真不少,

[《c++ preprocessor__va_args__number of arguments》][1]

但是排名第一的最佳答案有bug,在引數為空的時候計算錯誤。經測試找到正確計算方式,自己寫了乙個,**如下,gcc上測試通過(msv不支援)

// 計算 __va_args__ 引數個數,最大支援64個引數

#define fl_arg_count(...) fl_internal_arg_count_private(0, ##__va_args__,\

64, 63, 62, 61, 60, \

59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \

49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \

39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \

29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \

19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \

9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

#define fl_internal_arg_count_private(\

_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, \

_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \

_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \

_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \

_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \

_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \

_60, _61, _62, _63, _64, n, ...) n

// 測試**

fl_arg_count()

->

0fl_arg_count(1

)->

1fl_arg_count(1

,2)->

2fl_arg_count(1

,2,3

)->

3fl_arg_count(1

,2,3

,4)->

4fl_arg_count(1

,2,3

,4,5

)->

5fl_arg_count(1

,2,3

,4,5

,6)->

6fl_arg_count(1

,2,3

,4,5

,6,7

)->

7fl_arg_count(1

,2,3

,4,5

,6,7

,8)->

8fl_arg_count(1

,2,3

,4,5

,6,7

,8,9

)->

9fl_arg_count(1

,2,3

,4,5

,6,7

,8,9

,10)->

10fl_arg_count

(\ 1,2

,3,4

,5,6

,7,8

,9,10

,\ 1,2

,3,4

,5,6

,7,8

,9,10

,\ 1,2

,3,4

,5,6

,7,8

,9,10

,\ 1,2

,3,4

,5,6

,7,8

,9,10

,\ 1,2

,3,4

,5,6

,7,8

,9,10

,\ 1,2

,3,4

,5,6

,7,8

,9,10

,\ 1,2

,3,4\

)->

64

[《c++ preprocessor__va_args__number of arguments》][1]

[《macros with a variable number of arguments.》][2]

[1]:

[2]:

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadicmacros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 ...

可變引數巨集 VA ARGS

可變引數巨集 va args 在 gnu c 中,巨集可以接受可變數目的引數,就象函式一樣,例如 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如...