2012-09-07 13 views
6

Esto es lo que me gustaría hacer:¿Cómo saltar desde un bloque de código C++?

{ 
    ... 
    if(condition) 
     break; 
    ... 
} 

Esto funciona para un bucle. Me gustaría algo similar para un simple bloque de código. ¿Es posible?
¿Estoy obligado a usar un "goto"?


Creo que una extensión de la declaración break habría sido una adición útil a C++ 11 ...

+4

... o para refactorizar su código con más funciones atómicas. –

+0

puede dar un ejemplo? –

+1

Si publicara más código, podríamos sugerir una solución mejor que usar goto u otros trucos. – Steed

Respuesta

5

¿Qué tal

do 
{ 
    ... 
    if(condition) 
     break; 
    ... 
} 
while (0); 

Particularmente no me gusta este estilo pero lo he visto antes Si la refactorización está fuera de discusión (podría ser un bloqueo masivo que puede romper muchas cosas si se cambia), esta es una opción.

+5

¿Cómo es eso mejor que un 'goto'? – MSalters

+5

@MSalters para uno, no usa 'goto' ... –

+4

@LuchianGrigore No lo sé, funciona pero en este caso el truco es más confuso que un goto.Al menos con goto sabes lo que sucede y por qué, con do/while (imagino que su código no es corto aquí) cuando alguien lee el código, primero piensa en un ciclo, entonces debe entender la razón de un tiempo (0) .. –

4

Ésta:

{ 
    // ... 

    if (!condition) 
    { 
     // ... 
    } 
} 

Esto evitará goto para saltar de un bloque de código.

+1

Estoy de acuerdo contigo, pero en mi caso, la mayor parte del código debería moverse dentro de otro bloque si. Estilísticamente, sería mejor poder saltar fuera del bloque si la condición es verdadera. – Pietro

+0

ya esta es una forma simple de hacer y más comprensible es la comprensibilidad de su código que ser elegante. Para ser elegante, refiera el código de Luchian Grigore, no tiene ninguna afirmación. :) –

3

Aquí sólo algunas posibilidades adicionales:

for(..) 
{ 
    continue;//next loop iteration 
} 

void mymethod() 
{ 
    ... 
    return; 
    ... 
} 

Probablemente debería crear sub-métodos para el bloque de código problemática se desea utilizar Goto y dejar el bloque de código mediante el uso de retorno.

+0

Estos casos no responden la pregunta porque no son simples bloques de código –

+0

A veces la pregunta en sí es parte del problema. Volver a factorizar el código para usar sub-rutinas, en lugar de dejar un bloque de código probablemente sería la solución más limpia. Entonces ya no sería necesario abandonar un bloque de código específico. – Alex

4

Aquí hay una manera:

switch(0) { 
default: 
    /* code */ 
    if (cond) break; 
    /* code */ 
} 

(por favor, nunca hacer esto)

+0

idea genial, por qué no, lo que podría ir mal ... hasta este, mi mejor respuesta sería 'for (int i = 0;! I ++;) {...}' pero switch-case no implica variable y parece mejor – MetNP

3

En C++ 11 la mejor manera de lograr esto es utilizar una función lambda anónima y la sustitución de break con return

[&](){ 
    ... 
    if(condition) 
     return; 
    ... 
}(); 

Tenga en cuenta que [&] captura todas las variables por referencia, si no usa ninguna, simplemente reemplácela por []

+1

Agradable. Sin embargo, ese 'return' es engañoso, porque lo que el código pretende hacer es efectivamente un 'break'. – Pietro

+0

@Pietro ¡Tienes razón! Además, la principal limitación de este método es que no puede 'regresar' de la misma manera que un bloque. Si necesita que su bloque vuelva, entonces la solución 'do while' es la correcta. –

0

"Me gustaría algo similar para un simple bloque de código".

Utilice return después de que se cumpla una condición, y return controle de nuevo a la persona que llama.

void MyWorkerClass::doWork(Item & workItem) { 
    // ... 
    if(noMoreWorkToDo) 
     return; 
    // ... 
} 
Cuestiones relacionadas