Instructions étiquetées

Les étiquettes sont utilisées pour transférer le contrôle du programme directement à l'instruction spécifiée.

Syntaxe

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

L’étendue d’une étiquette est la fonction entière dans laquelle elle est déclarée.

Notes

Il existe trois types d'instructions étiquetées. Tous utilisent un signe deux-points (:) pour séparer un type d’étiquette de l’instruction. Les case étiquettes et default les étiquettes sont spécifiques aux instructions 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
}

Étiquettes et instruction goto

L’apparence d’une identifier étiquette dans le programme source déclare une étiquette. Seule une instruction peut transférer le goto contrôle vers une identifier étiquette. Le fragment de code suivant illustre l’utilisation de l’instruction goto et d’une identifier étiquette :

Une étiquette ne peut pas apparaître elle-même, mais doit toujours être attachée à une instruction. Si une étiquette doit apparaître seule, placez une instruction null après l'étiquette.

L’étiquette a une étendue de fonction et ne peut pas être déclarée dans la fonction. Toutefois, le même nom peut être utilisé en tant qu'étiquette dans différentes fonctions.

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

Étiquettes dans l’instruction case

Les étiquettes qui apparaissent après le case mot clé ne peuvent pas également apparaître en dehors d’une switch instruction. (Cette restriction s’applique également à la default mot clé.) Le fragment de code suivant montre l’utilisation correcte des case étiquettes :

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

Voir aussi

Vue d’ensemble des instructions C++
Instruction switch (C++)