首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ MFC 根據用戶權限動態載入菜單:賦值 (=) 與比較 (==) 低級錯誤

     編輯:程式設計綜合問答

問題代碼


if (m_power = 1)  // 錯誤!這是賦值,結果恆為真
    LoadMenu(IDR_MAINMENU);
else
    LoadMenu(IDR_MENU3);

結果:無論 `m_power` 為 0 或 1,皆載入 `MAINMENU`。

錯誤分析

  • `m_power = 1` 是**賦值運算**,將 `m_power` 設為 1,運算式值為 1 (真)。
  • `if` 判斷條件恆成立,永遠執行 `if` 分支。

正確代碼


if (m_power == 1)  // 比較運算
    LoadMenu(IDR_MAINMENU);
else
    LoadMenu(IDR_MENU3);

編譯器警告與最佳實踐

  1. 開啟警告等級 4 (/W4):MSVC 會報 `warning C4706: assignment within conditional expression`。
  2. Yoda 條件 (常量左側):`if (1 == m_power)` — 若誤寫 `=` 編譯直接報錯 (無法賦值給常量)。
  3. 靜態分析工具:Cppcheck, SonarQube, PVS-Studio 皆能檢測此類缺陷。
  4. Code Review**:針對 `if`/`while` 條件中的單一 `=` 進行重點審查。

擴展:權限菜單的更好架構


// 資源檔定義多個菜單 IDR_MENU_ADMIN, IDR_MENU_USER, IDR_MENU_GUEST
// 程式碼
UINT GetMenuResourceByPower(int power) {
    switch (power) {
        case 1: return IDR_MENU_ADMIN;
        case 2: return IDR_MENU_USER;
        default: return IDR_MENU_GUEST;
    }
}

// 初始化
m_hMenu = LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(GetMenuResourceByPower(m_power)));
SetMenu(m_hMenu);

避免硬編碼 `if-else` 鏈,擴充權限層級只需增 `case`。

結論

經典 C/C++ 低級錯誤:**條件判斷寫成賦值 `=`**。修正為 `==`,並養成 **Yoda 條件** 或 **開啟高等級警告** 習慣,從編譯期攔截此類 Bug。菜單載入邏輯建議表驅動化,提升可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved