"hacer, mientras que" y "Ir a cabo" son diferentes en estas áreas:
1.inicialización de variable local
void foo(bool t = false)
{
if (t)
{
goto DONE;
}
int a = 10; // error : Goto bypass local variable's initialization
cout << "a=" << a << "\n";
DONE:
}
Está bien inicializar las variables locales in situ en do ... while (0) block.
void bar(bool t = false)
{
do{
if (t)
{
break;
}
int a = 10; // fine
cout << "a=" << a << "\n";
} while (0);
}
2 diferencia para Macros. "do while" es un poco mejor. "Goto HECHO" en una macro no es el caso. Si el código de salida es más complicado, por no vea así:
err = some_func(...);
if (err)
{
register_err(err, __LINE__, __FUNC__);
#if defined (_DEBUG)
do_some_debug(err)
#endif
break;
}
y se escribe el código una y otra vez, es probable que los puso en una macro.
#define QUIT_IF(err) \
if (err) \
{ \
register_err(err, __LINE__, __FUNC__); \
DO_SOME_DEBUG(err) \
break; // awful to put break in macro, but even worse to put "goto DONE" in macro. \
}
Y el código se convierten en:
do
{
initial();
do
{
err = do_step1();
QUIT_IF(err);
err = do_step2();
QUIT_IF(err);
err = do_step3();
QUIT_IF(err);
....
} while (0);
if (err) { // harder for "goto DONE" to get here while still using macro.
err = do_something_else();
}
QUIT_IF(err);
.....
} while (0);
3.do ... while (0) maneja diferentes niveles de salida de la misma macro. El código se muestra arriba. goto ... no es el caso para Macro porque necesita etiquetas diferentes para diferentes niveles.
Al decir eso, no me gustan los dos. Prefiero usar el método de excepción. Si no se permite la excepción, entonces uso "do ... while (0)", dado que todo el bloque está sangrado, en realidad es más fácil de leer que el estilo "goto DONE".
Usar while (1) para esto hace que quien lea el código espere que se ejecute "infinitamente" ... ¿Por qué no utilizar do {} while (0)? –
@Tal Pressman: ¿por qué sería eso diferente? –
@Earwicker, con esa opción es obvio que se ejecutará al menos una vez, y que no se ejecutará nuevamente porque la condición es "while (0)". El confuso "while (1)" no aparece. –