рдореИрдВрдиреЗ рдорд╛рдирдХ C ++ 11 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ рдпрд╛ рдмреВрд╕реНрдЯ рдЗрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдХреНрдпреЛрдВ рд╣реИред рдЕрдзреНрдпрд╛рдп 2

рд╣рд╛рдБ - рд╣рд╛рдБ, рдЗрд╕ рдЖрджрд░реНрд╢ рд╡рд╛рдХреНрдп рдХреЗ рд╕рд╛рде рдореИрдВ рдпреБрджреНрдз рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢


рд╕реА ++ 11 рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдХрд╛рд░рдг, рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХрддрд╛ рдХреА рдХрдореА рд╕реЗ, рдмреВрд╕реНрдЯрд░ рдиреЗ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ C ++ 98 / C ++ 03 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдорд╛рдирдХ C ++ 11 рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдорд╛рдирдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ type_traits , thread , mutex , chrono , nullptr.h рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреНрд╕ std :: nullptr_t рдФрд░ core.h рдЬрд╣рд╛рдВ рдореИрдХреНрд░реЛ рдХрдВрдкрд╛рдЗрд▓рд░- рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдмреЗрд╕рдмреНрд░реА рдФрд░ рдЧреИрд░-рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЬ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде GitHub рдХреЛ рд▓рд┐рдВрдХ рдХрд░реЗрдВ:

рдХрдорд┐рдЯ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ

рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛


рдкрд░рд┐рдЪрдп
рдЕрдзреНрдпрд╛рдп 1. рд╡реАрдЖрдИрдПрдо рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╡рдбреЗрдВрд╕
рдЕрдзреНрдпрд╛рдп 2. #ifndef __CPP11_SUPPORT__ #define __COMPILER_SPECIFIC_BUILT_IN_AND_MACRO_HELL__ #endif
рдЕрдзреНрдпрд╛рдп 3. рд╕рд╣реА nullptr рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдвреВрдБрдврдирд╛
рдЕрдзреНрдпрд╛рдп 4. рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдЬрд┐рдХ
.... рек.рез рд╣рдо рдЫреЛрдЯреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
.... рек.реи рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рддрдиреА рдЪрдорддреНрдХрд╛рд░реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ
.... рек.рей рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдСрд▓-рдСрд▓-рдСрд▓
.... 4.4 рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдФрд░ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
рдЕрдзреНрдпрд╛рдп 5
...

рдЕрдзреНрдпрд╛рдп 2. #ifndef __CPP11_SUPPORT__ #define __COMPILER_SPECIFIC_BUILT_IN_AND_MACRO_HELL__ #endif


рд╕рднреА рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдХрдВрдШреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ "рдорд╛рдирдХ" рд╣реЗрдбрд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрд▓рдЧ рдирд╛рдорд╕реНрдерд╛рди stdex рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдореИрдВ type_traits , nullptr.h рдФрд░ рдПрдХ рд╣реА core.h рдХреЗ рд╕рд╛рде рдЖрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рд╛ , рдЬрд┐рд╕рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдереЗ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдорд╛рдирдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдорд░реНрдерди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдереЗред рджреЗрд╢реА nullptr , char16_t , char32_t рдФрд░ static_assert ред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╕реА ++ рдорд╛рдирдХ (рдЦрдВрдб 14.8) рдХреЗ рдЕрдиреБрд╕рд╛рд░, __cplusplus рдореИрдХреНрд░реЛ рдХреЛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдорд░реНрдерд┐рдд рдорд╛рдирдХ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

C++ pre-C++98: #define __cplusplus 1 C++98: #define __cplusplus 199711L C++98 + TR1: #define __cplusplus 199711L // ??? C++11: #define __cplusplus 201103L C++14: #define __cplusplus 201402L C++17: #define __cplusplus 201703L 

рддрджрдиреБрд╕рд╛рд░, рд╕рдорд░реНрдерди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рддреБрдЪреНрдЫ рд╣реИ:

 #if (__cplusplus >= 201103L) //  C++ 11   #define _STDEX_NATIVE_CPP11_SUPPORT //   11  (nullptr, static_assert) #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT //    char16_t, char32_t #endif 

рдЫрд╡рд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдм рдПрдХ рд░реЗрдХ рдХреЗ рд╕рд╛рде рджрд┐рд▓рдЪрд╕реНрдк рдмреИрд╕рд╛рдЦреА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА, рдпрд╛ рдмрд▓реНрдХрд┐ рдХреЛрдИ рднреА рдирд╣реАрдВ, рд╕рдВрдХрд▓рдХ рдЕрдЧрд▓реЗ рдорд╛рдирдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдФрд░ рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2013 рдореЗрдВ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдерд╛ , рдЬрдмрдХрд┐ рдпрд╣ рджрд╛рд╡рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ C ++ 11 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ - рдХреИрд╡рд┐рдЯреА рдХреЗ рд╕рд╛рде рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рд╡рд╣ рд╣реИ, рдСрдЯреЛ - рдХреГрдкрдпрд╛, static_assert - рдмрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдПрдордПрд╕ рд╡реАрдПрд╕), рд▓реЗрдХрд┐рди constexpr рдирд╣реАрдВ рд╣реИ ред рджреВрд╕рд░реЗ, рд╕рднреА рдХрдВрдкрд╛рдЗрд▓рд░ (рдФрд░ рдпрд╣ рдФрд░ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ) рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдордп рдкрд░ рдЕрджреНрдпрддрди рдХрд░рддреЗ рд╣реИрдВред рдЕрдЪрд╛рдирдХ, рдПрдХ рд╣реА рд╕рдВрдХрд▓рдХ рдореЗрдВ, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдиреЗ рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ __cplusplus рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ , рд╣рд╛рд▓рд╛рдВрдХрд┐ C ++ 11 рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреА рдШреЛрд╖рдгрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХреА рдЧрдИ рд╣реИ (рдЬреЛ рд╕рдЪ рднреА рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрддреЛрд╖ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд┐рд░рдгреЗрдВ рд╣реИрдВ - рдЬреИрд╕реЗ рд╣реА рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП "рдирдпрд╛" рдЖрддрд╛ рд╣реИ) "11 рдорд╛рдирдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рддреБрд░рдВрдд рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ C99 рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рдЕрдиреНрдп" рд╕реБрд╡рд┐рдзрд╛рдПрдБ "рдирд╣реАрдВ рд╣реИрдВ)ред рдФрд░ рд╕реНрдерд┐рддрд┐ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдорд╛рдирдХ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдорд╛рди рдХреЛ рдЙрдкрд░реЛрдХреНрдд рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рд╡реЗ рдШреЛрд╖рд┐рдд рдорд╛рдирдХреЛрдВ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╛рдЗрди рдХрд╛ рдРрд╕рд╛ рд╡рд┐рдХрд╛рд╕ (рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде, рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐):

 standart C++98: #define __cplusplus 199711L // C++98 standart C++98 + TR1: #define __cplusplus 200311L // C++03 nonstandart C++11: #define __cplusplus 200411L // C++03 + auto and dectype nonstandart C++11: #define __cplusplus 200511L // C++03 + auto, dectype and constexpr(partly) ... standart C++11: #define __cplusplus 201103L // C++11 

рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдореБрдЦреНрдп рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрдХрд▓рдХ "рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реБрдЖ" рд╣реИред

рдЗрд╕ рд╕рдм рдХреЗ рдХрд╛рд░рдг (рдореИрдВ рдЗрд╕ рд╢рдмреНрдж рд╕реЗ рдирд╣реАрдВ рдбрд░рддрд╛), рдЕрдм рд╣рд░ рдЧреИрд░-рдорд╛рдирдХ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд╛рдВрдЪ рд▓рд┐рдЦрдиреА рд╣реЛрдЧреА рдХрд┐ рдХреМрди рд╕реА C ++ рдорд╛рдирдХ рдФрд░ рдХрд┐рддрдирд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХреБрдЫ рд╕рдВрдХрд▓рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ, рдЕрдм рд╣рдо рдЗрд╕ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп _MSC_VER рдореИрдХреНрд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рдБрдЪ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рд╕рдорд░реНрдерд┐рдд рд╕рдВрдХрд▓рдХ рдХреЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рд╕реА ++ рдмреЛрд░рд▓реИрдВрдб рдмрд┐рд▓реНрдбрд░ 6.0 рднреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдмрджрд▓реЗ рдореЗрдВ, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ (рдЗрд╕рдХреА "рд╕реБрд╡рд┐рдзрд╛рдУрдВ" рдФрд░ рдмрдЧреНрд╕ рд╕рд╣рд┐рдд) рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрддреНрд╕реБрдХ рдереЗ, рдлрд┐рд░ рдЕрдЪрд╛рдирдХ рдпрд╣ рдореИрдХреНрд░реЛ рднреА рд╣реИред рдХреНрд▓реИрдВрдЧ-рд╕рдВрдЧрдд рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рдореИрдХреНрд░реЛ __has_feature ( feature_name ) рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдпрд╛ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдирддреАрдЬрддрди, рдХреЛрдб рдХреЛ рдлреВрд▓рд╛ рд╣реБрдЖ рд╣реИ:

 #ifndef __has_feature #define __has_feature(x) 0 // Compatibility with non-clang compilers. #endif // Any compiler claiming C++11 supports, Visual C++ 2015 and Clang version supporting constexpr #if ((__cplusplus >= 201103L) || (_MSC_VER >= 1900) || (__has_feature(cxx_constexpr))) // C++ 11 implementation #define _STDEX_NATIVE_CPP11_SUPPORT #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif 

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

 #ifndef __has_feature #define __has_feature(x) 0 // Compatibility with non-clang compilers. #endif // Any compiler claiming C++11 supports, Visual C++ 2015 and Clang version supporting constexpr #if ((__cplusplus >= 201103L) || (_MSC_VER >= 1900) || (__has_feature(cxx_constexpr))) // C++ 11 implementation #define _STDEX_NATIVE_CPP11_SUPPORT #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #if !defined(_STDEX_NATIVE_CPP11_TYPES_SUPPORT) #if ((__cplusplus > 199711L) || defined(__CODEGEARC__)) #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #endif 

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА _MSC_VER 1600 рд╕рдВрдХрд▓рдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ nullptr рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ char16_t рдФрд░ char32_t , рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдЫ рдФрд░ рдЪреЗрдХ рдЬреЛрдбрд╝реЗ рдЧрдП:

 #ifndef __has_feature #define __has_feature(x) 0 // Compatibility with non-clang compilers. #endif // Any compiler claiming C++11 supports, Visual C++ 2015 and Clang version supporting constexpr #if ((__cplusplus >= 201103L) || (_MSC_VER >= 1900) || (__has_feature(cxx_constexpr))) // C++ 11 implementation #define _STDEX_NATIVE_CPP11_SUPPORT #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #if !defined(_STDEX_NATIVE_CPP11_TYPES_SUPPORT) #if ((__cplusplus > 199711L) || defined(__CODEGEARC__)) #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #endif #if ((!defined(_MSC_VER) || _MSC_VER < 1600) && !defined(_STDEX_NATIVE_CPP11_SUPPORT)) #define _STDEX_IMPLEMENTS_NULLPTR_SUPPORT #else #define _STDEX_NATIVE_NULLPTR_SUPPORT #endif #if (_MSC_VER >= 1600) #ifndef _STDEX_NATIVE_CPP11_TYPES_SUPPORT #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #endif 

рдЙрд╕реА рд╕рдордп, рд╣рдо C ++ 98 рд╕рдорд░реНрдерди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХреБрдЫ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рдФрд░ рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдкреВрд░реНрдг рд╡рд┐рдХрд▓реНрдк
 #ifndef __has_feature #define __has_feature(x) 0 // Compatibility with non-clang compilers. #endif // Any compiler claiming C++11 supports, Visual C++ 2015 and Clang version supporting constexpr #if ((__cplusplus >= 201103L) || (_MSC_VER >= 1900) || (__has_feature(cxx_constexpr))) // C++ 11 implementation #define _STDEX_NATIVE_CPP11_SUPPORT #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #if !defined(_STDEX_NATIVE_CPP11_TYPES_SUPPORT) #if ((__cplusplus > 199711L) || defined(__CODEGEARC__)) #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #endif #if ((!defined(_MSC_VER) || _MSC_VER < 1600) && !defined(_STDEX_NATIVE_CPP11_SUPPORT)) #define _STDEX_IMPLEMENTS_NULLPTR_SUPPORT #else #define _STDEX_NATIVE_NULLPTR_SUPPORT #endif #if (_MSC_VER >= 1600) #ifndef _STDEX_NATIVE_CPP11_TYPES_SUPPORT #define _STDEX_NATIVE_CPP11_TYPES_SUPPORT #endif #endif #if _MSC_VER // Visual C++ fallback #define _STDEX_NATIVE_MICROSOFT_COMPILER_EXTENSIONS_SUPPORT #define _STDEX_CDECL __cdecl #if (__cplusplus >= 199711L) #define _STDEX_NATIVE_CPP_98_SUPPORT #endif #endif // C++ 98 check: #if ((__cplusplus >= 199711L) && ((defined(__INTEL_COMPILER) || defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)))))) #ifndef _STDEX_NATIVE_CPP_98_SUPPORT #define _STDEX_NATIVE_CPP_98_SUPPORT #endif #endif 


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

рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдЙрдкрд▓рдмреНрдзрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреЛрдб рднрд░ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░-рдирд┐рд░реНрднрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдкреНрд░рд╕рд╛рд░ рд╕рдВрднрд╡ рдерд╛, рдЬреЛ рдХреЛрдб рдХреНрд▓реАрдирд░ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рджрд░реНрдЬрдиреЛрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдвреЗрд░ рднреА рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдирдХ 11 рдХреА рдпрд╛рдж рдЖ рд░рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдФрд░ рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ static_assert рдкрд░рд┐рдЪрдп рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

static_assert


рд╣рдо StaticAssertion рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реЗрдЧрд╛ - рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреА, рдпрджрд┐ рдпрд╣ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЭреВрдареА рд╣реИ ), рдПрдХ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдФрд░ рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ ( рд╕реНрдЯреЗрдЯрд┐рдХрдПрд╕реЗрд░реНрд╕рд┐рдпрди ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдбрдореА рд╕рдВрд░рдЪрдирд╛ред

 namespace stdex { namespace detail { template <bool> struct StaticAssertion; template <> struct StaticAssertion<true> { }; // StaticAssertion<true> template<int i> struct StaticAssertionTest { }; // StaticAssertionTest<int> } } 

рдФрд░ рдЖрдЧреЗ рдореИрдХреНрд░реЛ рдЬрд╛рджреВ

 #ifdef _STDEX_NATIVE_CPP11_SUPPORT #define STATIC_ASSERT(expression, message) static_assert((expression), #message) #else // no C++11 support #define CONCATENATE(arg1, arg2) CONCATENATE1(arg1, arg2) #define CONCATENATE1(arg1, arg2) CONCATENATE2(arg1, arg2) #define CONCATENATE2(arg1, arg2) arg1##arg2 #define STATIC_ASSERT(expression, message)\ struct CONCATENATE(__static_assertion_at_line_, __LINE__)\ {\ stdex::detail::StaticAssertion<static_cast<bool>((expression))> CONCATENATE(CONCATENATE(CONCATENATE(STATIC_ASSERTION_FAILED_AT_LINE_, __LINE__), _WITH__), message);\ };\ typedef stdex::detail::StaticAssertionTest<sizeof(CONCATENATE(__static_assertion_at_line_, __LINE__))> CONCATENATE(__static_assertion_test_at_line_, __LINE__) #ifndef _STDEX_NATIVE_NULLPTR_SUPPORT #define static_assert(expression, message) STATIC_ASSERT(expression, ERROR_MESSAGE_STRING) #endif #endif 

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 STATIC_ASSERT(sizeof(void*) == 4, non_x32_platform_is_unsupported); 

рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдорд╛рдирдХ рдПрдХ рдХреЗ рдмреАрдЪ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрддрд╛рдП рдмрд┐рдирд╛ рдЗрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдХреЛрдИ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реА ++ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирд╛рдо, рдФрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрдпрдирд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ STATIC_ASSERT рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ C ++ 11 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЗрдП рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред __Cplusplus рдФрд░ рдЧреИрд░-рдорд╛рдирдХ рд╕рдВрдХрд▓рдХ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C ++ 11 рд╕рдорд░реНрдерди (рдФрд░ рдЗрд╕рд▓рд┐рдП static_assert ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдЬреЛ _STDEX_NATIVE_CPP11_SOSPORT рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдореИрдХреНрд░реЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдорд╛рдирдХ static_assert рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 #ifdef _STDEX_NATIVE_CPP11_SUPPORT #define STATIC_ASSERT(expression, message) static_assert((expression), #message) 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ STATIC_ASSERT рдореИрдХреНрд░реЛ рдХрд╛ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдирд╣реАрдВ рд╣реИ , рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдСрдкрд░реЗрдЯрд░ # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рд╕рдВрджреЗрд╢ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдорд╛рдирдХ static_assert рдореЗрдВ рд╕рдВрдЪрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ ред
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдХрд▓рдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо "рдЧреНрд▓реВрдЗрдВрдЧ" рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдореИрдХреНрд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВрдЧреЗ (рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдСрдкрд░реЗрдЯрд░ ## рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╕ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ)ред

 #define CONCATENATE(arg1, arg2) CONCATENATE1(arg1, arg2) #define CONCATENATE1(arg1, arg2) CONCATENATE2(arg1, arg2) #define CONCATENATE2(arg1, arg2) arg1##arg2 

рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ #define CONCATENATE ( arg1 , arg2 ) arg1 ## arg2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ arg1 рдФрд░ arg2 рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА CONCATENATE рдореИрдХреНрд░реЛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред
рд╕реБрдВрджрд░ рдирд╛рдо __static_assertion_at_line_ {рд╕реНрдЯреНрд░рд┐рдВрдЧ тДЦ} (__LINE__ рдореИрдХреНрд░реЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреЛ рдмрддрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП), рдФрд░ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рднреАрддрд░ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдкреНрд░рдХрд╛рд░ STATIC_ASSERTION_FAILED_AT_LINE_ рдирд╛рдорд┐рдд StaticAssertion рдЬреЛрдбрд╝рдиреЗ {тДЦ рдкрдВрдХреНрддрд┐рдпреЛрдВ} _WITH __ {рдкрд╛рда рдХреЗ рд╕рд╛рде рдпрд╣ рднреА рдШреЛрд╖рдгрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЙрд▓рд┐рдВрдЧ рдореИрдХреНрд░реЛ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢}ред

 #define STATIC_ASSERT(expression, message)\ struct CONCATENATE(__static_assertion_at_line_, __LINE__)\ {\ stdex::detail::StaticAssertion<static_cast<bool>((expression))> CONCATENATE(CONCATENATE(CONCATENATE(STATIC_ASSERTION_FAILED_AT_LINE_, __LINE__), _WITH__), message);\ };\ typedef stdex::detail::StaticAssertionTest<sizeof(CONCATENATE(__static_assertion_at_line_, __LINE__))> CONCATENATE(__static_assertion_test_at_line_, __LINE__) 

StaticAssertion рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде, рд╣рдо рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ STATIC_ASSERT рдореЗрдВ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ , рдЬреЛ рдЗрд╕реЗ рдмреВрд▓ рддрдХ рд▓реЗ рдЬрд╛рддреА рд╣реИ ред рдЕрдВрдд рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп-рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, aticstory_serertion_test_at_line_ {рд▓рд╛рдЗрди рдирдВрдмрд░} рдирд╛рдо рдХреЗ рд╕рд╛рде StaticAssertionTest <sizeof (рдКрдкрд░ рдШреЛрд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд╛рдо ) рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

STATIC_ASSERT рдкрд░рд┐рдгрд╛рдо
рдЬреАрд╕реАрд╕реА:
30: 103: рддреНрд░реБрдЯрд┐: рдлрд╝реАрд▓реНрдб 'STATIC_ASSERTION_FAILED_AT_LINE_36_WITH__non_x32_platform_is_unsupported' рдореЗрдВ рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ 'stdex :: detail :: Staticer- рдХрд╛рдВрд╕реНрдЯреЗрдВрдЯреЗрд╢рди <рдЧрд▓рдд>' рд╣реИ
25:36: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ 'CONCATENATE2'
23:36: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'CONCATENATE1'
30:67: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'CONCATENATE'
24:36: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'CONCATENATE2'
23:36: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'CONCATENATE1'
30:79: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'CONCATENATE'
24:36: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'CONCATENATE2'
23:36: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'CONCATENATE1'
30:91: рдиреЛрдЯ: рдореИрдХреНрд░реЛ 'рд╡рд┐рд╕реНрддрд╛рд░' рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ
36: 3: рдиреЛрдЯ: рдореИрдХреНрд░реЛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ 'STATIC_ASSERT'

рдмреЛрд░рд▓реИрдВрдб рд╕реА ++ рдмрд┐рд▓реНрдбрд░:
[C ++ рддреНрд░реБрдЯрд┐] stdex_test.cpp (36): E2450 рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ 'stdex :: detail :: StaticAssertion <0>'
[C ++ рддреНрд░реБрдЯрд┐] stdex_test.cpp (36): E2449 рдХрд╛ рдЖрдХрд╛рд░ 'STATIC_ASSERTION_FAILED_AT_LINE_36_WITH__non_x32_platform_is_unsupport' рдЕрдЬреНрдЮрд╛рдд рдпрд╛ рд╢реВрдиреНрдп рд╣реИ
[C ++ рддреНрд░реБрдЯрд┐] stdex_test.cpp (36): E2450 рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ 'stdex :: detail :: StaticAssertion <0>'

рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ:
рддреНрд░реБрдЯрд┐ c2079


рджреВрд╕рд░рд╛ "рдЯреНрд░рд┐рдХ" рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬрдмрдХрд┐ рдорд╛рдирдХ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛрдирд╛ рдЙрд▓рдЯреА рдЧрд┐рдирддреА рд╣реИ - рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдирдирд╛ред рд╕рд╛рдЗрдЬрд╝рд░реНрд╕ рдЗрд╕ рдореИрдХреНрд░реЛ рдХреЛ рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ (рдЕрд░реЗ) / рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ (рдЕрд░реЗрд╕реНрдЯ [0]) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╣реБрдд рд╢реМрдХреАрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред

countof


 #ifdef _STDEX_NATIVE_CPP11_SUPPORT #include <cstddef> namespace stdex { namespace detail { template <class T, std::size_t N> constexpr std::size_t _my_countof(T const (&)[N]) noexcept { return N; } } // namespace detail } #define countof(arr) stdex::detail::_my_countof(arr) #else //no C++11 support #ifdef _STDEX_NATIVE_MICROSOFT_COMPILER_EXTENSIONS_SUPPORT // Visual C++ fallback #include <stdlib.h> #define countof(arr) _countof(arr) #elif defined(_STDEX_NATIVE_CPP_98_SUPPORT)// C++ 98 trick #include <cstddef> template <typename T, std::size_t N> char(&COUNTOF_REQUIRES_ARRAY_ARGUMENT(T(&)[N]))[N]; #define countof(x) sizeof(COUNTOF_REQUIRES_ARRAY_ARGUMENT(x)) #else #define countof(arr) sizeof(arr) / sizeof(arr[0]) #endif 

рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдк рд╕рдкреЛрд░реНрдЯ рд╡рд╛рд▓реЗ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдПрдХ рдХреЙрдиреНрдЯреЗрдХреНрд╕ рд╡рд░реНрдЬрди рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ (рдЬреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдорд╛рдирдХреЛрдВ рдХреЗ рд▓рд┐рдП, COUNTOF_REQUIRES_ARRAY_ARGUMENT рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ ), рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди COUNTOF_REQUIRES_ARRAY_UMGUMY_UMGUMY_UMGUMY рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ рдпрд╣рд╛рдБ рдлрд┐рд░ рд╕реЗ stdlib.h рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ _countof рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИред

COUNTOF_REQUIRES_ARRAY_ARGUMENT рдлрд╝рдВрдХреНрд╢рди рдбрд░рдкреЛрдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рдЯреА рдФрд░ рдЖрдХрд╛рд░ рдПрди рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИ - рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ (рдирд╣реАрдВ рд╕рд░рдгрд┐рдпреЛрдВ) рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдкреНрд░рд╕рдиреНрди рдХрд░рддреА рд╣реИред рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдиреЗ рдкрд░, рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдХрдард┐рдирд╛рдИ рдХреЗ рд╕рд╛рде) рдХрд┐ рдпрд╣ рдЖрдХрд╛рд░ рдПрди рдХреЗ рдЪрд╛рд░ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ ред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рдЪрд╛рд╣рд┐рдП? рдпрд╣рд╛рдБ sizeof рдСрдкрд░реЗрдЯрд░ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЕрджреНрд╡рд┐рддреАрдп рдХреНрд╖рдорддрд╛ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЖрдХрд╛рд░рдСрдлрд╝ рдХреЙрд▓ ( COUNTOF_REQUIRES_ARRAY_ARGUMENT ) рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдЪрд╛рд░ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдорд╛рдирдХ sizeof (char) == 1, рдпрд╣ рдореВрд▓ рд╕рд░рдгреА рдореЗрдВ рдПрди рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╕реБрдВрджрд░, рд╕реБрдВрджрд░ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореБрдХреНрддред

рд╕рджреИрд╡


рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рдореИрдХреНрд░реЛ рдЬреЛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рднреА рдЕрдирдВрдд рд▓реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ ред рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 #if !defined(forever) #define forever for(;;) #else #define STRINGIZE_HELPER(x) #x #define STRINGIZE(x) STRINGIZE_HELPER(x) #define WARNING(desc) message(__FILE__ "(" STRINGIZE(__LINE__) ") : warning: " desc) #pragma WARNING("stdex library - macro 'forever' was previously defined by user; ignoring stdex macro definition") #undef STRINGIZE_HELPER #undef STRINGIZE #undef WARNING #endif 

рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрдирдВрдд рд▓реВрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

  unsigned int i = 0; forever { ++i; } 

рдЗрд╕ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ "рдХреГрддреНрд░рд┐рдо рдЪреАрдиреА рдЬреЛрдбрд╝реЗрдВ" рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рдЗрд╕реЗ рдлреЙрд░рдПрд╡рд░ рдкреНрд▓рдЧ-рдЗрди рдореИрдХреНрд░реЛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рдЬреЛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ, рд╡рд╣реА рд╡рд╛рд░реНрдирд┐рдВрдЧ рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ рд╕рднреА рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдпрд╣ рдкрд░рд┐рдЪрд┐рдд рдорд╛рдирдХ __LINE__ рдореИрдХреНрд░реЛ рдФрд░ рдорд╛рдирдХ __FILE__ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

stdex_assert


рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЬреЛрд░ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП , рдореИрдХреНрд░реЛ stdex_assert рдирд┐рдореНрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 #if defined(assert) #ifndef NDEBUG #include <iostream> #define stdex_assert(condition, message) \ do { \ if (! (condition)) { \ std::cerr << "Assertion `" #condition "` failed in " << __FILE__ \ << " line " << __LINE__ << ": " << message << std::endl; \ std::terminate(); \ } \ } while (false) #else #define stdex_assert(condition, message) ((void)0) #endif #endif 

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдмрд╣реБрдд рдЧрд░реНрд╡ рд╣реИ (рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдЪреЗрдХ рдХреЛ рдЫреБрдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, {{ рдЬрдмрдХрд┐ (рдЧрд▓рдд) рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ "рд╕реЗрд╡рд╛" рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рддрдХрдиреАрдХ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрдИ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

noexcept


рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рди рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдиреЛрдПрд╕реЗрдкреНрдЯ рдХреАрд╡рд░реНрдб рдХреЛ рдирдП рдорд╛рдирдХ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдХреНрд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рджрд░реНрдж рд░рд╣рд┐рдд рд╣реИ:

 #ifdef _STDEX_NATIVE_CPP11_SUPPORT #define stdex_noexcept noexcept #else #define stdex_noexcept throw() #endif 

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ noexcept рдорд╛рдирдХ рдПрдХ bool рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдВрдХрд▓рди рд╕рдордп рд╣реИ рдХрд┐ рд╡рд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рдирд╣реАрдВ рд╣реИ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреЗрд╡рд▓ " рд╕реНрдЯреНрд░рд┐рдкреНрдб рдбрд╛рдЙрди" stdex_noexcept рд╣реИред

рджреВрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рдХрд╛ рдЕрдВрддред рддреАрд╕рд░рд╛ рдЕрдзреНрдпрд╛рдп nullptr рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдЧрд╛, рдХрд┐ рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрдпреЛрдВ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде type_traits рдХреЗ рд╡рд┐рдХрд╛рд╕, рдФрд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЕрдиреНрдп рдХреАрдбрд╝реЗ рдХреНрдпрд╛ рд╣реИрдВ рдЬреЛ рдореИрдВ рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЖрдпрд╛ рдерд╛ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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


All Articles