title: Can there only be one default in a switch in C++?
body: <p>I am learning to code games in C++ from "Programming 2D Games" and I have a basic WinMain program shown below however the book says to use two default labels. However my IDE (VS2013) is telling me that a default label has already appeared in the switch.</p>
  
  <p>Is there a way around this issue or have I made a mistake within the switch? I have cross referenced with the book however I can't find any information on this.</p>
  
  <pre><code>#define WIN32_LEAN_AND_MEAN
  #include &lt;windows.h&gt; 
  // Function prototypes
  int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
  bool CreateMainWindow(HINSTANCE, int);
  LRESULT WINAPI WinProc(HWND, UINT, WPARAM, LPARAM);
  // global variable
  HINSTANCE hinst;
  HDC hdc;                // Handle to device context
  TCHAR ch = ' ';         // Character entered
  RECT rect;              // Rectangle structure
  PAINTSTRUCT ps;         // Used in WM_PAINT
  // Constants 
  const char CLASS_NAME[] = "Keyboard";
  const char APP_TITLE[] = "Character Input";
  const int WINDOW_WIDTH = 400;  
  const int WINDOW_HEIGHT = 400;
  //==================================
  // Starting point for the windows application
  // Parameters are
  // hInstance. Handle to the current instance of the application 
  // hPrevInstance. Always NULL, obsolete parameter
  // lpCmdLine. Pointer to null-terminated string of command arguements 
  // nCmdShow. Specifies how the window is to be shown 
  //=================================
  
  int WINAPI WinMain(HINSTANCE    hInstance,
      HINSTANCE   hPrevInstance,
      LPSTR       lpCmdLine,
      int         nCmdShow )
  
  {
      MSG msg;
      // Create thw window 
      if (!CreateMainWindow(hInstance, nCmdShow))
          return false;
      // Main message loop 
      int done = 0;
      while (!done)
      {
          // PeekMessage is a non blocking message for Windows messages 
          if (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE))
          {
              // Look for quit message
              if (msg.message == WM_QUIT)
                  done = 1;
              // Decode and pass messages on to WinProc
              TranslateMessage(&amp;msg);
              DispatchMessage(&amp;msg);    
  
          }
  
      }
      return msg.wParam;
  
  }
  
  //==============
  // Window event callback function 
  // ===============================
  LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
          {
      switch (msg)
      {
      case WM_DESTROY:
              //Tell windows to kill this program 
              PostQuitMessage(0);
              return 0;
      case WM_CHAR:       // A character was entered by the keyboard
          switch (wParam);    // The character is in wParam
          {
          case 0x08:  //Backspace
          case 0x09:  // Tab
          case 0x0A:  // Linefeed
          case 0x0D:  // Carriage return
          case 0x1B:  // Escape
              MessageBeep((UINT) -1);         // Beep but do not display 
              return 0;
          default:            // Displayable character
              ch = (TCHAR) wParam;        // Get the character 
              InvalidateRect(hWnd, NULL, TRUE);   // Force WM_PAINT 
              return 0;
          }
          case WM_PAINT:                  // The window needs to be redrawn 
              hdc = BeginPaint(hWnd, &amp;ps); // Get handle to device context 
              GetClientRect(hWnd, &amp;rect);     // Get the window rectangle
              // Display the character 
              TextOut(hdc, rect.right / 2, rect.bottom / 2, &amp;ch, 1);
              EndPaint(hWnd, &amp;ps);
              return 0;
          default:
              return DefWindowProc( hWnd, msg, wParam, lParam );
          }
  
  
  }
  //===========================================
  // Create the window
  // Returns: False on error
  //===========================================
  bool CreateMainWindow(HINSTANCE hInstance, int nCmdShow)
  {
      WNDCLASSEX wcx;
      HWND hwnd;
  
      // Fill in the window class structure with parameters 
      // That describe the main window 
      wcx.cbSize = sizeof(wcx);               // Size of the structure 
      wcx.style = CS_HREDRAW | CS_VREDRAW;    // Redraw if the size changes 
      wcx.lpfnWndProc = WinProc;              // Points to windows procedure 
      wcx.cbClsExtra = 0;                     // No extra class memory 
      wcx.cbWndExtra = 0;                     // No extra window memory
      wcx.hInstance = hInstance;
      wcx.hIcon = NULL;
      wcx.hCursor = LoadCursor(NULL, IDC_ARROW);      // Predifined arrow
      // Background brush
      wcx.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
      wcx.lpszMenuName = NULL;    // Name of menu resource 
      wcx.lpszClassName = CLASS_NAME; // Name of window class
      wcx.hIconSm = NULL;
  
      // Register the window class
      // RegisterClassEx return 0 on error
      if (RegisterClassEx(&amp;wcx) == 0) // if error 
          return false;
      // Create Window
      hwnd = CreateWindow(
          CLASS_NAME,                     // Name of window class
          APP_TITLE,                      // Title bar text
          WS_OVERLAPPEDWINDOW,            // Window style
          CW_USEDEFAULT,                  // Default horizontal postion of window
          CW_USEDEFAULT,                  // Default vertical postion of window
          WINDOW_WIDTH,                   // Width of window 
          WINDOW_HEIGHT,                  // Height of window 
          (HWND) NULL,                    // No parent window 
          (HMENU) NULL,                   // No menu
          hInstance,                      // Handle to application window
          (LPVOID) NULL);                 // No window parameters
      // If there was an error the window
      if (!hwnd)
          return false;
      // Show the window
      ShowWindow(hwnd, nCmdShow);
      // Send a WM_PAINT message to the window procedure 
      UpdateWindow(hwnd);
      return true;
  }
  </code></pre>