C / C ++ рдореЗрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рддреНрдпрд╛рдкрди

C / C ++ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рдЪрд░рдг рдореЗрдВ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рд╕рд╕реНрддрд╛ рддрд░реАрдХрд╛ рд╣реИред
рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛:



BOOST_STATIC_ASSERT рдФрд░ рд╕рднреА-рд╕рднреА


рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ, рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдкрд╕рдВрдж рд╣реИ:
#define ASSERT(cond) typedef int foo[(cond) ? 1 : -1] 


рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдмрдврд╝рд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: BOOST_STATIC_ASSERT ред рд╕рдорд░реНрдерди рднреА C ++ 11 (static_assert) рдореЗрдВ рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ ред

рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде, рдЕрдм рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

Enum рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ


рдЧрдгрдирд╛ рдЕрд░реНрде рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рддрд░реНрдХ рдХреЗ рд╢рд╛рдЦрд╛ рдмрд┐рдВрджреБ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдХрдИ рд╢рд╛рдЦрд╛ рдмрд┐рдВрджреБ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХреБрдЫ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 enum TEncryptMode { EM_None = 0, EM_AES128, EM_AES256, <b>EM_ItemsCount</b> }; 

рдЕрдВрддрд┐рдо рддрддреНрд╡ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрддрдо рд╕рд┐рдореЗрдВрдЯрд┐рдХ рддрддреНрд╡ рд╕реЗ рдЕрдзрд┐рдХ рдирдВрдмрд░ рдПрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕реНрдерд┐рд░ рд╣реИред

рдЕрдм рдЬрд╣рд╛рдВ рднреА рдЗрд╕ рд╕реЗрдЯ рд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 ASSERT(EM_ItemsCount == 3); 

рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдХреЛрдб рд╕рдВрдХрд▓рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдХреЛрдб рдХреЗ рдЗрд╕ рдЦрдВрдб рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдирдП рдирд┐рд░рдВрддрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

EM_ItemsCount рдХреА рд╢реБрд░реВрдЖрдд рд╕реЗ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░рдирдЯрд╛рдЗрдо-рдЪреЗрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
 assert( 0 <= mode && mode < EM_ItemsCount ); 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
 assert( 0 <= mode && mode <= EM_AES256 ); 

(EM_AES512 рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЧрд▓рдд рдЬрд╛рдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)

рдПрд░реЗ рдФрд░ рдПрдирдо


рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдорд╛рди рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдЙрдВрдЧрд▓реА рд╕реЗ рдереЛрдбрд╝рд╛ рдЪреВрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрд╡рди рдореЗрдВ рдРрд╕реЗ рд╣реА рдорд╛рдорд▓реЗ рд╣реИрдВ):
 static const ParamStruct params[] = { { EM_None, 0, ... }, { EM_AES128, 128, ... }, { EM_AES256, 256, ... }, { -1, 0, ... } }; 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ TEncryptMode рдХреЗ рд╕рд╛рде рд╕рдордХрд╛рд▓рд┐рдХ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
(рдореБрдЭреЗ рд╕рд░рдгреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╕рдордЭрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред)

рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕реНрдереВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
 #define lengthof(x) (sizeof(x) / sizeof((x)[0])) 

рдЕрдм, рдЖрдк рдПрдХ рдЪреЗрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕рд╣реА params рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдж):
 ASSERT( lengthof(params) == EM_ItemsCount + 1 ); 

рдЕрдкрдбреЗрдЯ: рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ , рд╕реНрдХреЛрдЯрд░ рд╣рдмреНрд░рд╛рдпреБрдЬрд╝рд░ рдиреЗ рд▓рдВрдмрд╛рдИ рдХреЗ рдореИрдХреНрд░реЛ рдХрд╛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╕реБрдЭрд╛рдпрд╛, рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рд╣реВрдВред

рд╕реНрд╡рд┐рдЪ


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ (рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рдж)ред рд╕реНрд╡рд┐рдЪ (рдореЛрдб) рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ:
 ASSERT(EM_ItemsCount == 3); 


рдереЛрдбрд╝рд╛ рдХрдо рд╕реНрдкрд╖реНрдЯ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ:
 ASSERT(EM_ItemsCount == 3); switch( mode ) { case ...: ... break; ... <b>default: assert( false );</b> } 

рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдврд╝ред рдпрджрд┐ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдорд▓реЗ-рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдмрд╛рдз рдЫреЛрдбрд╝рдирд╛:
 ... case ET_AES128: case ET_AES256: ... break; ... 


рд╡рд┐рд╖рдо рдбреЗрдЯрд╛ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдПрдВ


рдЖрдЗрдП рд╣рдо рдПрдиреБрдореЛрд╡ рд╕реЗ рджрдмреЗрдВ рдФрд░ рдРрд╕реА рдХрдХреНрд╖рд╛ рджреЗрдЦреЗрдВ:
 class MyData { ... private: int a; double b; ... }; 


рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рд╕рдордп, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдЗрдВрдЯ рд╕реА рдЪрд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдЗрд╕ рд╕рдордп рддрдХ рд╡рд░реНрдЧ рдмрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ред рдЪрд░ рд╕реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдХ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ?

рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЕрд░реНрдз-рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдорд╛рдзрд╛рди рд╡рд┐рдзрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ - рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░рдВрддрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ:
 class MyData { static const int DataVersion = 0; ... }; 

рдЕрдм, рд╕рднреА рддрд░реАрдХреЛрдВ рдореЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 ASSERT(DataVersion == 0); 


рдХрдХреНрд╖рд╛ рдореЗрдВ рдирдП рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ DataVersion рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣рд╛рдВ рдЕрдиреБрд╢рд╛рд╕рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдлрд╕реЛрд╕)ред рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рддреБрд░рдВрдд рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрди рд╕рддреНрдпрд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рдХреА рд╕реНрдерд╛рди рдЖрдВрддрд░рд┐рдХ рддрд░реНрдХ (рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрддреЗ рд╕рдордп (рдпрджрд┐ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ) рдЙрд╕реА рд╕реНрдерд┐рд░ (DataVersion) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рд▓рд╛рдн


рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?
рдкреЗрд╢реЗрд╡рд░реЛрдВ:


рд╡рд┐рдкрдХреНрд╖:


рдореЗрд░реЗ рд▓рд┐рдП, рдлрд╛рдпрджреЗ рдкрд▓реНрд▓рд╛ рдЭреБрдХрдирд╛, рд▓реЗрдХрд┐рди рдЖрдк рдХреЗ рд▓рд┐рдП?

рдЕрдкрдбреЗрдЯреЗрдб рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛрдбред

Source: https://habr.com/ru/post/In138813/


All Articles