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

MFC 數字時鐘鬧鐘:Unicode 字串字面值缺少 L 前綴導致連結錯誤

     編輯:程式設計綜合問答

錯誤訊息

error LNK2001: 無法解析的外部符號 "class ATL::CStringT<wchar_t...> s"

原因

專案設定為 **Unicode 字元集**,所有字串字面值必須加 L 前綴成為寬字串 wchar_t*。程式碼中 s = h + ":" + m + ":" + c; 的 ":" 為窄字串 char*,導致 CString 建構函式簽名不匹配,連結器找不到對應符號。

修正

// 修正前
s = h + ":" + m + ":" + c;

// 修正後:每個字面值加 L
s = h + L":" + m + L":" + c;

// 或使用 _T 宏 (自動適應 Unicode/MBCS)
s = h + _T(":") + m + _T(":") + c;

完整 OnTimer 修正範例

void CNDlg::OnTimer(UINT_PTR nIDEvent) {
    CTime t = CTime::GetCurrentTime();
    CString str;
    str.Format(L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(), t.GetSecond()); // Format 也要 L
    SetDlgItemText(IDC_curtime, str);

    CDialogEx::OnTimer(nIDEvent);

    if (alarmStr == str) { // alarmStr 為成員變數 CString
        MessageBox(L"TIME'S UP!", L"鬧鐘", MB_OK | MB_ICONINFORMATION);
    }
}

Unicode 專案最佳實務

  • 所有字串字面值統一用 _T("text") 或 L"text"。
  • CString 內部在 Unicode 專案為 CStringW,儲存 wchar_t。
  • API 呼叫使用寬字元版本 (如 SetWindowTextW),MFC 宏自動映射。
  • 專案屬性 → Advanced → Character Set: **Use Unicode Character Set**。

補充:鬧鐘比較邏輯優化

字串比較雖可行,但建議比較 CTime 或 int 時/分/秒,避免格式不一致問題:

if (t.GetHour() == alarmHour && t.GetMinute() == alarmMin && t.GetSecond() == alarmSec) { ... }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved