Benutzer mit den meisten Antworten
c2181 else without if

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)); }
- Bearbeitet Robert BreitenhoferModerator Freitag, 17. Juni 2011 15:57 Formatierung
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.
- Als Antwort vorgeschlagen Bordon Dienstag, 7. Juni 2011 05:31
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. Juni 2011 15:57
Alle 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.
- Als Antwort vorgeschlagen Bordon Dienstag, 7. Juni 2011 05:31
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 17. Juni 2011 15:57