none
c2181 else without if RRS feed

  • Frage

  • Warum erhalte ich beim Übersetzen der folgenden c-Datei einen Fehler C2181 in VS2010. Beim Setzen des Schalters /P lässt sich die datei fehlerfrei übersetzen.

    Vielen Dank,

    Rudolf

    #include <windows.h>
    #include <commctrl.h>
    
    void test()
    {
    HWND h;
    int a = 0;
    // geht nicht
    if (a > 0) 
    	ListView_SetItemState (h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
    else 
    	SendMessage (h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM (-1, 0));
    		
    // geht
    if (a > 0) 
    {
    	ListView_SetItemState (h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
    }
    else 
    	SendMessage (h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM (-1, 0));
    }

     

    Montag, 6. Juni 2011 13:33

Antworten

  • Erst einmal zur Kalrstellung, ich habe diesen code verwendet, und bekomme exakt den Fehler den Du beschrieben hast:

    #include <windows.h>
    #include <commctrl.h>
    
    void foo() 
    {
     HWND h;
     int a = 0;
    
     // geht nicht
     if (a > 0) 
      ListView_SetItemState(h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
     else 
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
    
     // geht
     if (a > 0) 
     {
      ListView_SetItemState(h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
     }
     else 
     {
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
     }
    }

    Letzlich ist das Problem für den Fehler das Semikolon hinter dem ersten ListView_SetItemState(...). Es handelt sich dabei um ein Define der in commctrl.h deklariert ist:

    #define ListView_SetItemState(hwndLV, i, data, mask) \
    { LV_ITEM _macro_lvi;\
     _macro_lvi.stateMask = (mask);\
     _macro_lvi.state = (data);\
     SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
    }

    Mit diesem define würde Dein code aufgelöst etwa wie Folgt aussehen:

    #include <windows.h>
    #include <commctrl.h>
    void foo() 
    {
     HWND h;
     int a = 0;
     // geht nicht
     if (a > 0) 
     { LV_ITEM _macro_lvi;\
      _macro_lvi.stateMask = (LVIS_FOCUSED | LVIS_SELECTED);\
      _macro_lvi.state = (0);\
      SNDMSG((h), LVM_SETITEMSTATE, (WPARAM)(FALSE), (LPARAM)(LV_ITEM *)&_macro_lvi);\
     }; /// <---- Das verbliebene Semikolon ist das was hinter dem ListView_SetItemState war! Dieses führt zum Fehler
     else 
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
     // geht
     if (a > 0) 
     {
      ListView_SetItemState(h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
     }
     else 
     {
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
     }
    }

     

    Jetzt ist denke ich ersichtlich, das das Semikolon hinter dem ListView_SetItemState() das Problem ist, da das if mit dem Semikolon jetzt abgeschlossen ist, und das else kein Bezug dazu mehr hat.

     

    Dienstag, 7. Juni 2011 05:25

Alle Antworten

  • das a=0 steht in einer neuen Zeile, dass muss eigentlich hinter dem int stehen. Ist das bloß ein einfügefehler oder siht der richtige Quelltext auch so aus?
    VisualCPlusPlus
    Montag, 6. Juni 2011 18:58
  • Erst einmal zur Kalrstellung, ich habe diesen code verwendet, und bekomme exakt den Fehler den Du beschrieben hast:

    #include <windows.h>
    #include <commctrl.h>
    
    void foo() 
    {
     HWND h;
     int a = 0;
    
     // geht nicht
     if (a > 0) 
      ListView_SetItemState(h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
     else 
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
    
     // geht
     if (a > 0) 
     {
      ListView_SetItemState(h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
     }
     else 
     {
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
     }
    }

    Letzlich ist das Problem für den Fehler das Semikolon hinter dem ersten ListView_SetItemState(...). Es handelt sich dabei um ein Define der in commctrl.h deklariert ist:

    #define ListView_SetItemState(hwndLV, i, data, mask) \
    { LV_ITEM _macro_lvi;\
     _macro_lvi.stateMask = (mask);\
     _macro_lvi.state = (data);\
     SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_macro_lvi);\
    }

    Mit diesem define würde Dein code aufgelöst etwa wie Folgt aussehen:

    #include <windows.h>
    #include <commctrl.h>
    void foo() 
    {
     HWND h;
     int a = 0;
     // geht nicht
     if (a > 0) 
     { LV_ITEM _macro_lvi;\
      _macro_lvi.stateMask = (LVIS_FOCUSED | LVIS_SELECTED);\
      _macro_lvi.state = (0);\
      SNDMSG((h), LVM_SETITEMSTATE, (WPARAM)(FALSE), (LPARAM)(LV_ITEM *)&_macro_lvi);\
     }; /// <---- Das verbliebene Semikolon ist das was hinter dem ListView_SetItemState war! Dieses führt zum Fehler
     else 
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
     // geht
     if (a > 0) 
     {
      ListView_SetItemState(h, -1, 0, LVIS_FOCUSED | LVIS_SELECTED);
     }
     else 
     {
      SendMessage(h, LB_SETSEL, (WPARAM)FALSE, MAKELPARAM(-1, 0));
     }
    }

     

    Jetzt ist denke ich ersichtlich, das das Semikolon hinter dem ListView_SetItemState() das Problem ist, da das if mit dem Semikolon jetzt abgeschlossen ist, und das else kein Bezug dazu mehr hat.

     

    Dienstag, 7. Juni 2011 05:25