1. C++ / Говнокод #6944

    +171

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    // Файл settings.cpp
    #define SETTINGS_READ
    #include "Settings.h" 
    
    #undef SETTINGS_READ
    #include "Settings.h" 
    #endif
    
    // ----------------------------------
    // Файл settings.h
    #ifdef SETTINGS_READ
            #define _XML_OPTION_VALUE(name,value) if (XML.FindElem(_CRT_WIDE(#name))) {/*XML.IntoElem();*/ XML.GetData(value);  /*ShowVar(value);ShowVar(_CRT_WIDE(#name));*/  /* XML.OutOfElem();*/}
            #define _XML_OPTION_ATTR(name,value) XML.GetAttrib(_CRT_WIDE(#name),value) 
            #define XML_NODE_START(name,value) if (XML.FindElem(_CRT_WIDE(#name))) {XML.IntoElem();
            #define XML_NODE_START_WITHATTRIB(name,value) if (XML.FindElem(_CRT_WIDE(#name))) {
            #define XML_NODE_STARTS(name,value) if (XML.FindElem(name)) {
            #define XML_NODE_START_VALUE(name,value) if (XML.FindElem(_CRT_WIDE(#name))) { XML.GetData(value);XML.IntoElem();
            #define XML_NODE_START_VALUE_WITHATTRIB(name,value) if (XML.FindElem(_CRT_WIDE(#name))) { XML.GetData(value);     
            #define XML_NODE_END()  \
                    XML.OutOfElem(); \
            }
            #define XML_OPTION_VALUE(name) _XML_OPTION_VALUE(name,name)
            #define XML_OPTION_MEMBER_VALUE(prefix, name) _XML_OPTION_VALUE(name, prefix##.name)
            #define XML_OPTION_ATTR(name) _XML_OPTION_ATTR(name,name)
            #define XML_OPTION_MEMBER_ATTR(prefix, name) _XML_OPTION_ATTR(name, prefix##.name)
            #define COLOR_TO_PINT(c) (*(int*)&##c)
    #else
            // SAVING MACROSES
            #define _XML_OPTION_VALUE(name,value) XML.AddElem(_CRT_WIDE(#name),value) ; /*XML.OutOfElem();*/
            #define _XML_OPTION_ATTR(name,value) XML.SetAttrib(_CRT_WIDE(#name),value) 
            #define XML_NODE_START(name,value) XML.AddElem(_CRT_WIDE(#name)); {XML.IntoElem();
            // ( еще десяток макросов)
    #endif
    
    #ifdef SETTINGS_READ
    bool CSettings::MacroLoadSettings(CMyXml &XML)
    {
    #else
    bool CSettings::MacroSaveSettings(CMyXml &XML)
    {
    #endif
            TCHAR szFont[1024];
    	CString Font;
            XML_NODE_START(Settings);   
            XML_NODE_START(General);
                    XML_OPTION_MEMBER_VALUE(Settings,Language); 
                    XML_OPTION_VALUE(ExplorerContextMenu);
    
                    #ifndef  SETTINGS_READ
                             HotkeysStr= Settings.Hotkeys.toString();
                             FontToString(&LogoSettings.Font,Font);                        
                    #endif
                            
                    XML_OPTION_VALUE(HotkeysStr);
                            #ifdef  SETTINGS_READ
                                    Settings.Hotkeys.DeSerialize(HotkeysStr);
                                    StringToFont(Font, &LogoSettings.Font);
                            #endif
                    #endif
            XML_NODE_END();
           // ..............................................
            XML_NODE_END(); // end of settings
            XML_NODE_END(); // 
            return true;
    }

    Фееричный пример повторного использования кода с помощью директив препроцессора.

    Создано с целью совместить в одном месте чтение/запись настроек программы (с риском что-нибудь забыть) из XML файла.

    Запостил: Kernel32, 13 Июня 2011

    Комментарии (26) RSS

    Добавить комментарий