рдЬреАрд╕реАрд╕реА рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓-рд▓реЗрдВрде рдПрд░реЗ

рдПрдХ рд╕рд╣рдкрд╛рдареА рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдФрд░ рд╕рдВрдХрд▓рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде C ++ рдХреЛрдб рднреЗрдЬрд╛ред рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рдЪреАрдЬ рдиреЗ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╣реИрд░рд╛рди рдХрд┐рдпрд╛, рд╡рд╣ рдЙрд╕рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рдмрд▓реНрдХрд┐ рдпрд╣ рддрдереНрдп рдХрд┐ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдХреЛрдб рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рдереАред рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рд╕реАрдЦрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдФрд░ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЬреАрдм рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╣рдкрд╛рдареА рдХреЗ рд╕рдВрдХрд▓рдХ рдиреЗ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХреА рд╣реИрдВ:

рдореИрдВрдиреЗ рдХрд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рд╕реА ++ 14 рдорд╛рдирдХ рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд╛рд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрд╕рд▓реА рдПрдХ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ C99 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡реАрдПрд▓рдПрдПрдПрд╕ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдореИрдВ рдЬреАрд╕реАрд╕реА 4.8.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛:
void foo( int n) { int array[n]; } 

рдИрдорд╛рдирджрд╛рд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рдХ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд▓реМрдЯрд╛:
рдЪреЗрддрд╛рд╡рдиреА: ISO C ++ рд╡реИрд░рд┐рдПрдмрд▓ рд▓рдВрдмрд╛рдИ рд╕рд░рдгреА 'рд╕рд░рдгреА' рдХреЛ рдордирд╛ рдХрд░рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, gcc рдореЗрдВ C ++ рдХреЗ рд▓рд┐рдП VLAs рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВ ред

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрдЯрд░ рд░рди-рдЯрд╛рдЗрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп-рд▓рдВрдмрд╛рдИ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЧрдгрдирд╛ рд╕рдордп рдореЗрдВ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдХрд╛рд░ (vla) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ:
 template <int p> class A { }; void foo(int length) { int const_lenght_array[7]; int variable_length_array[length]; A<sizeof(const_lenght_array)> a1; //OK A<sizeof(variable_length_array)> a2; //ERROR } 

рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╕рд░рдгреА рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ:
рддреНрд░реБрдЯрд┐: '(рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int) ((((((sizetype) ((ssizetype) рд▓рдВрдмрд╛рдИ) + -1)) + 1u) * 4u)' рдПрдХ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ

рддреБрдо рднреА рдЪрд░ рд▓рдВрдмрд╛рдИ рдФрд░ рдЯрд╛рдЗрдк рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 int (*p)[length] = &variable_length_array; typedef int variable_int_array_t [length]; 

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ, GNU рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЖрдкрдХреЛ рд╡реИрд░рд┐рдПрдмрд▓ рд▓реЗрдВрде рдХреЗ рд╡реИрд░рд┐рдПрдмрд▓ рд▓рдВрдмрд╛рдИ рдХреЗ рдПрд░реЗ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдирдП рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдореЗрдВ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рд▓рдВрдмрд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИ:
 void bar(int a, int b) { int auto_array[a][b]; //OK int (*dynamic_array)[b] = new int[a][b]; //ERROR } 

рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡реАрдПрд▓рдП рдХреЛ рд╕реА ++ 14 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╕реА 99 рдХреЗ рд╡реАрдПрд▓рдП рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрд╕рдВрдЧрдд рд╣реИрдВред рдЙрдирдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ рдФрд░ рдЯрд╛рдЗрдкрдбреЗрдлрд╝ / (рд╕реА ++ 11) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреАрдорд╛рд░ рд╣реЛрдЧрд╛ред рдпрд╣ рд╣рдореЗрдВ рд░реЗрдХ рдкрд░ рдХрджрдо рдирд╣реАрдВ рд░рдЦрдиреЗ рджреЗрдЧрд╛, рдЖрдХрд╛рд░ рд╕реЗ рдХреЗрд╡рд▓ рдЕрдиреБрдкрд╛рд▓рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдБ gcc рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕реА ++ рдореЗрдВ рд╡реАрдПрд▓рдП рдмреЗрдХрд╛рд░ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ: рдРрд╕реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рд╣реИред рдлрд┐рд░ рднреА, рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдРрд╕реЗ рдЕрд╡рд╕рд░ рдХреЛ рдЬреАрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдирд╛ рдерд╛, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдп рди рд╣реЛред
рдЕрдВрдд рдореЗрдВ, рдУрдкрди-рдПрд╕рдЯреАрдбреА рдореЗрдВ рд╡реАрдПрд▓рдП рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ ред

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


All Articles