Instrucciones con etiqueta

Las etiquetas se usan para transferir el control de programas directamente a la instrucción especificada.

Sintaxis

labeled-statement:
identifier : statement
case constant-expression : statement
default : statement

El ámbito de una etiqueta es toda la función donde se declara.

Comentarios

Hay tres tipos de instrucciones con etiquetas. En todas ellas se utiliza el carácter de dos puntos (:) para distinguir el tipo de etiqueta de la instrucción. Las etiquetas case y default son específicas para las instrucciones case.

#include <iostream>
using namespace std;

void test_label(int x) {

    if (x == 1){
        goto label1;
    }
    goto label2;

label1:
    cout << "in label1" << endl;
    return;

label2:
    cout << "in label2" << endl;
    return;
}

int main() {
    test_label(1);  // in label1
    test_label(2);  // in label2
}

Etiquetas y la instrucción goto

La aparición de una etiqueta identifier en el programa de origen declara una etiqueta. Solo una instrucción goto puede transferir el control a una etiqueta identifier. En el siguiente fragmento de código se muestra el uso de la instrucción goto y una etiqueta identifier:

Una etiqueta no puede aparecer por sí misma; debe estar asociada siempre a una instrucción. Si se necesita la propia etiqueta, coloque una instrucción null detrás de la etiqueta.

La etiqueta tiene ámbito de función y no se puede volver a declarar dentro de la función. Sin embargo, se puede utilizar el mismo nombre como una etiqueta en diferentes funciones.

// labels_with_goto.cpp
// compile with: /EHsc
#include <iostream>
int main() {
   using namespace std;
   goto Test2;

   cout << "testing" << endl;

   Test2:
      cerr << "At Test2 label." << endl;
}

//Output: At Test2 label.

Etiquetas en la instrucción case

Las etiquetas que aparecen después de la palabra clave case no pueden aparecer también fuera de una instrucción switch. (Esta restricción también se aplica a la palabra clave default). En el fragmento de código siguiente se muestra el uso correcto de las etiquetas case:

// Sample Microsoft Windows message processing loop.
switch( msg )
{
   case WM_TIMER:    // Process timer event.
      SetClassWord( hWnd, GCW_HICON, ahIcon[nIcon++] );
      ShowWindow( hWnd, SW_SHOWNA );
      nIcon %= 14;
      Yield();
      break;

   case WM_PAINT:
      memset( &ps, 0x00, sizeof(PAINTSTRUCT) );
      hDC = BeginPaint( hWnd, &ps );
      EndPaint( hWnd, &ps );
      break;

   case WM_CLOSE:
      KillTimer( hWnd, TIMER1 );
      DestroyWindow( hWnd );
      if ( hWnd == hWndMain )
         PostQuitMessage( 0 );  // Quit the application.
      break;

   default:
      // This choice is taken for all messages not specifically
      //  covered by a case statement.
      return DefWindowProc( hWnd, Message, wParam, lParam );
      break;
}

Consulte también

Información general sobre instrucciones de C++
Instrucción switch (C++)