ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 июля
1416349
abivan (19.03.2024 20:28, просмотров: 584)
XMACRO. Как бы избавиться от макроопределения 

EN_PREFIX


#define PASTE(X, Y) X ## Y
#define X_MACRO_FOR_EXPAND_AS(X1, X2) PASTE(X1, X2)

#define EXPAND_INPUT_CASE( X1, X2, X3) \
       settings.X_MACRO_FOR_EXPAND_AS(EN_PREFIX, .)X1 = \
       (X2)GetValueUsingEnum(enInListPar_##X1, \
                              X_MACRO_FOR_EXPAND_AS(enInOutType, EN_PREFIX));
//#define COMMON_INPUT_CASE(X) _COMMON_INPUT_CASE(X)
#define _COMMON_INPUT_CASE(X) \
      case enInOutType##X: \
        COMMON_INPUT_##X( EXPAND_INPUT_CASE)\
      break;
#define COMMON_INPUT_FireManual( INPUT_FIRE_MANUAL )              \
        INPUT_FIRE_MANUAL( bArmDelay,                uint8_t, 8)  \
        INPUT_FIRE_MANUAL( fAutoArmE,                uint8_t, 1)  \
        INPUT_FIRE_MANUAL( fDisallowDisarm,          uint8_t, 1)  \
        INPUT_FIRE_MANUAL( btfIndicationControlMode, uint8_t, 2)  \
        INPUT_FIRE_MANUAL( fReserveBatteryControlE,  uint8_t, 1)  \
        INPUT_FIRE_MANUAL( Dummy3,                   uint8_t, 3)  \

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#undef  EN_PREFIX
#define EN_PREFIX FireManual
_COMMON_INPUT_CASE(FireManual)



это разворачивается в

case enInOutTypeFireManual: 
  settings.FireManual.bArmDelay = (uint8_t)GetValueUsingEnum(enInListPar_bArmDelay, enInOutTypeFireManual); 
  settings.FireManual.fAutoArmE = (uint8_t)GetValueUsingEnum(enInListPar_fAutoArmE, enInOutTypeFireManual); 
  settings.FireManual.fDisallowDisarm = (uint8_t)GetValueUsingEnum(enInListPar_fDisallowDisarm, enInOutTypeFireManual); 
  settings.FireManual.btfIndicationControlMode = (uint8_t)GetValueUsingEnum(enInListPar_btfIndicationControlMode,   enInOutTypeFireManual); 
  settings.FireManual.fReserveBatteryControlE = (uint8_t)GetValueUsingEnum(enInListPar_fReserveBatteryControlE, enInOutTypeFireManual); 
  settings.FireManual.Dummy3 = (uint8_t)GetValueUsingEnum(enInListPar_Dummy3, enInOutTypeFireManual); 
break;

Хотелось бы как то в EXPAND_INPUT_CASE передать не EN_PREFIX, а чтобы использовался параметр FireManual, который передаётся в макро _COMMON_INPUT_CASE