что означает наличие кодовых блоков в середине функции или программы
Скобки используются для управления областью действия.Открывающая скобка создает новую и меньшую область видимости.Закрывающая фигурная скобка заканчивает новую и меньшую область видимости.
Если в меньшей области видимости были объявлены автоматические переменные, то автоматические переменные перестают существовать в закрывающей скобке.Это освобождает имя переменной для повторного использования в следующей области.
Хотя в вашем примере кода ничего особенного не происходит, что-то особенное может произойти в закрывающей скобке.Конец области действия также может освободить переменные авто-памяти, в том числе вызывать dtor пользовательских объектов определения (класса или структур).
В следующем блоке 1 (с именем «использование автоматического продвижения») показан способ использования автоматического продвижения для создания порядка байтов, требуемого в значении «результат», и указания для пользователя:inspect.
В блоке 2 (с использованием static_cast) добивается того же и обратите внимание, что случается повторное использование объявленной автоматической переменной с именем «result».Столкновение с 1-м блоком auto var не происходит, поскольку закрывающая фигурная скобка завершила область для имени 'result' блока 1.
Блок 3 (используя статическую функцию приведения моего собственного создания) делает то же самое... объявляет 'результат' в третий раз, снова без столкновений.
int exec()
{
uint8_t byte0 = 0x00;
uint8_t byte1 = 0xAA;
uint8_t byte2 = 0x00;
uint8_t byte3 = 0xAA;
uint16_t hword0 = 0xAA00;
//uint16_t hword1 = 0xAAAA; not used
// using auto-promotion
{
uint64_t b4567 = hword0; // auto promotion
uint64_t b3 = byte3;
uint64_t b2 = byte2;
uint64_t b1 = byte1;
uint64_t b0 = byte0;
uint64_t result = (
(b4567 << 32) |
(b3 << 24) |
(b2 << 16) |
(b1 << 8) |
(b0 << 0) );
cout << "\n " << hex << result << endl;
}
// using static cast
{
uint64_t result = (
(static_cast<uint64_t>(hword0) << 32) |
(static_cast<uint64_t>(byte3) << 24) |
(static_cast<uint64_t>(byte2) << 16) |
(static_cast<uint64_t>(byte1) << 8) |
(static_cast<uint64_t>(byte0) << 0 )
);
cout << "\n " << hex << result << endl;
}
// using static cast function
{
uint64_t result = (
(sc(hword0) << 32) |
(sc(byte3) << 24) |
(sc(byte2) << 16) |
(sc(byte1) << 8) |
(sc(byte0) << 0 )
);
cout << "\n " << hex << result << endl;
}
return 0;
}
Можно захватить автоматическую память и освободить ее, управляя областью действия внутренних автоматических переменных.Эта память может даже использоваться повторно с другим именем.
Блоки кода (для небольших областей) позволяют программисту использовать автоматическую память по-разному.
Функция 'sc'предназначен для уменьшения набора текста.
// vvvvvvvv ---- formal parameter allows auto-promotion
uint64_t sc(uint64_t ui64) {
return static_cast<uint64_t>(ui64); // static cast
}