Информация об изменениях

Сообщение Re[4]: do { ... } while(false); от 18.09.2014 13:48

Изменено 18.09.2014 13:54 Andrew.W Worobow

Здравствуйте, -n1l-, Вы писали:

N>Ну конкретно тут в чем плюс его использования?


Вообще по правильному ( в теории, но не на практике ) вместо такого while(1) {;;; break;} или do {}while(0); надо делать функцию в которой уже выходить на end просто по return.
Но на практике особенно там где код не оптимизируют ( ядро например ) но производительность требуется используют такой вот метод.

while (1){
   HANDLE h = open();
   if ( !h )
      break;
   while (1){
      s=write(h,"{");
      if ( !s )
         break;
      
      write(h,"abc,def,uuu");

      write(h,"}");
      break;
   }
   close(h); 
   break;
}


то есть это по уму, по идеализму надо заменять на функцию даже если она один раз вывывается, но еще на понятно что яснее, функция которая написана только для того чтобы брековаться по return вместо goto.

То есть есть такие операции которые требуют "операций скобок" — открыл -> надо закрыть, записал начало "{" надо записть и конец "}". И так делее.

В этом случае в конце кода действий возникает логика — а открыли мы или нет, и если открыли надо закрыть. И так далее.

Но если применять логику иную — типа создавать объект у которого есть свойсто "открыть" и есть констуктор и есть деструктор то тогда такая логика с проверкой а мы открыли или нет в том же деструкторе выглядит логично. Но если это просто небольшой код, и нет нужды городить обьекты и классы, ну как я уже сказал в ядре например. Где эфективность важнее красоты, а оптимизации от компилятора нет, то пишут вот так — ну не очень красиво, но по привыкнешь — нормально.


N>Понимаю если бы там макросы были, а так...
Re[4]: do { ... } while(false);
Здравствуйте, -n1l-, Вы писали:

N>Ну конкретно тут в чем плюс его использования?


Вообще по правильному ( в теории, но не на практике ) вместо такого while(1) {;;; break;} или do {}while(0); надо делать функцию в которой уже выходить на end просто по return.
Но на практике особенно там где код не оптимизируют ( ядро например ) но производительность требуется используют такой вот метод.

while (1){
   HANDLE h = open();
   if ( !h )
      break;
   while (1){
      s=write(h,"{");
      if ( !s )
         break;
      
      write(h,"abc,def,uuu");

      write(h,"}");
      break;
   }
   close(h); 
   break;
}


то есть это по уму, по идеализму надо заменять на функцию даже если она один раз вывывается, но еще не понятно что яснее — функция которая написана только для того чтобы брековаться по return вместо goto.

То есть есть такие операции которые требуют "операций скобок" — открыл -> надо закрыть, записал начало "{" надо записть и конец "}". И так делее.

В этом случае в конце кода действий возникает логика — а открыли мы или нет, и если открыли надо закрыть. И так далее.

Но если применять логику иную — типа создавать объект у которого есть свойсто "открыть" и есть констуктор и есть деструктор то тогда такая логика с проверкой а мы открыли или нет в том же деструкторе выглядит логично. Но если это просто небольшой код, и нет нужды городить обьекты и классы, ну как я уже сказал в ядре например. Где эфективность важнее красоты, а оптимизации от компилятора нет, то пишут вот так — ну не очень красиво, но по привыкнешь — нормально.


N>Понимаю если бы там макросы были, а так...