【Definición de macro】——juzgando si el valor de la macro es un valor específico

Función descriptiva

Se utiliza para determinar si el valor de la macro es un valor específico

vieja forma

#define CFG_MCU      10

#if (CFG_MCU == 10)
xxx
#endif

Nuevo método

#define _TU_CHECK_MCU(_m)   (CFG_MCU == _m)
#define TU_CHECK_MCU(...)   (TU_ARGS_APPLY(_TU_CHECK_MCU, ||, 1))

#if TU_CHECK_MCU(100)
xxx
#endif

lograr


#define _GET_NTH_ARG( \
          _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,N,...) N
#define _RSEQ_N() \
         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 _TU_NARG(...)      _GET_NTH_ARG(__VA_ARGS__)

#define TU_ARGS_NUM(...)   _TU_NARG(_0, __VA_ARGS__, _RSEQ_N()) /* 该宏用于获取宏有几个参数 */

// Apply an macro X to each of the arguments with an separated of choice
#define TU_ARGS_APPLY(_X, _s, ...)   TU_XSTRCAT(_TU_ARGS_APPLY_, TU_ARGS_NUM(__VA_ARGS__))(_X, _s, __VA_ARGS__)

#define _TU_ARGS_APPLY_1(_X, _s, _a1)                                    _X(_a1)
#define _TU_ARGS_APPLY_2(_X, _s, _a1, _a2)                               _X(_a1) _s _X(_a2)
#define _TU_ARGS_APPLY_3(_X, _s, _a1, _a2, _a3)                          _X(_a1) _s _TU_ARGS_APPLY_2(_X, _s, _a2, _a3)
#define _TU_ARGS_APPLY_4(_X, _s, _a1, _a2, _a3, _a4)                     _X(_a1) _s _TU_ARGS_APPLY_3(_X, _s, _a2, _a3, _a4)
#define _TU_ARGS_APPLY_5(_X, _s, _a1, _a2, _a3, _a4, _a5)                _X(_a1) _s _TU_ARGS_APPLY_4(_X, _s, _a2, _a3, _a4, _a5)
#define _TU_ARGS_APPLY_6(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6)           _X(_a1) _s _TU_ARGS_APPLY_5(_X, _s, _a2, _a3, _a4, _a5, _a6)
#define _TU_ARGS_APPLY_7(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6, _a7)      _X(_a1) _s _TU_ARGS_APPLY_6(_X, _s, _a2, _a3, _a4, _a5, _a6, _a7)
#define _TU_ARGS_APPLY_8(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) _X(_a1) _s _TU_ARGS_APPLY_7(_X, _s, _a2, _a3, _a4, _a5, _a6, _a7, _a8)


// Helper to check if configured MCU is one of listed
// Apply _TU_CHECK_MCU with || as separator to list of input
#define _TU_CHECK_MCU(_m)   (CFG_MCU == _m)
#define TU_CHECK_MCU(...)   (TU_ARGS_APPLY(_TU_CHECK_MCU, ||, OPT_MCU_NRF5X))

analizar

  • TU_ARGS_APPLYSe usa para elegir cuál usar TU_ARGS_APPLYx, dónde TU_XSTRCAT(_TU_ARGS_APPLY_, TU_ARGS_NUM(__VA_ARGS__))conectarse _TU_ARGS_APPLY_y después de la conexión, etc. 宏参数个数 1 2 3_TU_ARGS_APPLY_1 _TU_ARGS_APPLY_2
  • Después de que la conexión macro es _TU_ARGS_APPLY_1(_X, _s, __VA_ARGS__)la macro, la expansión macro es _TU_CHECK_MCU(OPT_MCU_NRF5X)y la expansión macro esCFG_MCU == OPT_MCU_NRF5X
  • Si hay _TU_ARGS_APPLY_2(_X, _s, a1, a2)macros con varios parámetros que son o más parámetros, la expansión de la macro es _TU_CHECK_MCU(a1) -s _TU_CHECK_MCU(a2)que _TU_CHECK_MCU(a1) || _TU_CHECK_MCU(a2)la expansión esCFG_MCU == a1 || CFG_MCU == a2

Supongo que te gusta

Origin blog.csdn.net/tyustli/article/details/132012000
Recomendado
Clasificación