ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
778104 Топик полностью
vllv (05.09.2017 08:49, просмотров: 420) ответил Dingo на По показанным фрагментам непонятна идея/как_это_работает. X-MACRO видел, читал, понимаю (хоть и не прозрачно). А с вашими фрагментами нет.
Файл приложил, но имейте ввиду - X-MACRO бьет по мозгам, как табак в самогонке, я просто беспокоюсь, что по этой причине вы отметете что-то хорошее (мое или не мое, неважно).  // names definitions #undef IMPL_GET #undef IMPL_SET #undef IMPL_PROLOG #undef IMPL_EPILOG #undef IMPL_VARIABLE // name of property #define IMPL_PROLOG(obj) #define IMPL_EPILOG() #define IMPL_VARIABLE(obj, i, name, get, set) const NAME_TYPE obj##i##_name = name; #include objects_file #undef IMPL_PROLOG #undef IMPL_EPILOG #undef IMPL_VARIABLE // pointers to properties names of one object #define IMPL_PROLOG(obj) NAME_TYPE const * const obj##_names[] = { #define IMPL_EPILOG() }; #define IMPL_VARIABLE(obj, i, name, get, set) &obj##i##_name, #include objects_file #undef IMPL_PROLOG #undef IMPL_EPILOG #undef IMPL_VARIABLE //name // get name function #define IMPL_PROLOG(obj) void obj##GetName(DompParserResultType * dpr) \ { if (COUNT_ELEMENTS(obj##_names) <= PN) AbsentP(); \ else \ { \ dpr->name = obj##_names[PN]; \ } \ } #define IMPL_EPILOG() #define IMPL_VARIABLE(obj, i, name, get, set) #include objects_file #undef IMPL_PROLOG #undef IMPL_EPILOG #undef IMPL_VARIABLE // get var function #define IMPL_PROLOG(obj) void obj##GetVar(DompParserResultType * dpr) { switch (PN) { #define IMPL_EPILOG() default: AbsentP(); } } #define IMPL_VARIABLE(obj, i, name, get, set) case i: get; #include objects_file #undef IMPL_PROLOG #undef IMPL_EPILOG #undef IMPL_VARIABLE // set var function #define IMPL_PROLOG(obj) void obj##SetVar(DompParserResultType * dpr) { switch (PN) { #define IMPL_EPILOG() default: AbsentP(); } } #define IMPL_VARIABLE(obj, i, name, get, set) case i: set; #include objects_file #undef IMPL_PROLOG #undef IMPL_EPILOG #undef IMPL_VARIABLE #define DECLARE_METHODS(dummy, obj_name) { obj_name##GetName, obj_name##GetVar, obj_name##SetVar } const VOID_METHOD object_methods[][3] = { #ifdef _LAMP_ DECLARE_METHODS (A, system), DECLARE_METHODS (B, control_temp), DECLARE_METHODS (C, reserved), DECLARE_METHODS (D, service), DECLARE_METHODS (E, boot), #endif #ifdef _SENSOR_ DECLARE_METHODS (A, system), DECLARE_METHODS (B, local_compare), DECLARE_METHODS (C, illumination), DECLARE_METHODS (D, service), DECLARE_METHODS (E, boot), #endif #ifdef _CU_ #ifdef _APPLICATION_ DECLARE_METHODS (A, system), DECLARE_METHODS (B, ports), DECLARE_METHODS (C, mode), DECLARE_METHODS (D, group), DECLARE_METHODS (E, setup), #endif #ifdef _BOOT_ DECLARE_METHODS (A, system), #endif #endif }; const u16 OBJECTS_QUANTITY = COUNT_ELEMENTS(object_methods); void GetName(DompParserResultType * dpr) { if (OBJECTS_QUANTITY > ON) { object_methods[ON][0](dpr); dpr->tx_op_code=UniGetName; } else AbsentO(); } void GetVar(DompParserResultType * dpr) { if (OBJECTS_QUANTITY > ON) { dpr->tx_op_code=UniGetValue; object_methods[ON][1](dpr); } else AbsentO(); } void SetVar(DompParserResultType * dpr) { if (OBJECTS_QUANTITY > ON) { object_methods[ON][2](dpr); dpr->tx_op_code=dpr->rx_op_code; } else AbsentO(); }