Condividi tramite


Istruzioni con etichetta

Le etichette vengono usate per trasferire il controllo del programma direttamente all'istruzione specificata.

Sintassi

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

L'ambito di un'etichetta è l'intera funzione in cui viene dichiarata.

Osservazioni:

Esistono tre tipi di istruzioni etichettate. Tutti usano due punti (:) per separare un tipo di etichetta dall'istruzione . Le case etichette e default sono specifiche delle istruzioni 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
}

Etichette e istruzione goto

L'aspetto di un'etichetta identifier nel programma di origine dichiara un'etichetta. Solo un'istruzione goto può trasferire il controllo a un'etichetta identifier . Il frammento di codice seguente illustra l'uso dell'istruzione goto e di un'etichetta identifier :

Un'etichetta non può essere visualizzata da sola, ma deve essere sempre associata a un'istruzione. Se è necessario che un'etichetta appaia da sola, inserire un'istruzione null dopo di essa.

L'etichetta ha un ambito di funzione e non può essere dichiarata nuovamente all'interno della funzione. Tuttavia, lo stesso nome può essere utilizzato come etichetta in funzioni differenti.

// 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.

Etichette nell'istruzione case

Le etichette visualizzate dopo la case parola chiave non possono essere visualizzate anche all'esterno di un'istruzione switch . Questa restrizione si applica anche alla default parola chiave . Il frammento di codice seguente mostra l'uso corretto delle case etichette:

// 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;
}

Vedi anche

Panoramica delle istruzioni C++
switch istruzione (C++)