首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

STL 字符串與 Unicode:tstring 最佳實踐

     編輯:關於C++

啟動時檢測 Ctrl 鍵

若需在用戶雙擊啟動時按住 Ctrl 進入特殊模式,GetCommandLine/__argc/CCommandLineInfo 均無法檢測。正確方法是調用 GetKeyState(VK_CONTROL):

if (GetKeyState(VK_CONTROL) < 0) {
    // 進入特殊模式(如恢復默認設置)
}

高位為 1 表示鍵被按下。常用組合鍵如 Ctrl+F8 用於恢復工作區。

STL string 與 Unicode 的結合

TCHAR 機制回顧

// tchar.h 簡化版
#ifdef _UNICODE
    typedef wchar_t TCHAR;
    #define __T(x) L ## x
#else
    typedef char TCHAR;
    #define __T(x) x
#endif

Windows API 根據 _UNICODE 映射為 A/W 版本:CreateFile → CreateFileA/W。

定義 tstring

STL 已提供 basic_string 模板,string/wstring 為其具體化:

typedef basic_string<char, char_traits<char>, allocator<char>> string;
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> wstring;

最簡潔的 tstring 定義:

#ifdef _UNICODE
    #define tstring wstring
#else
    #define tstring string
#endif

優於重新 typedef basic_string<TCHAR,...>,避免產生額外模板實例(現代編譯器會優化,但語義更清晰)。

使用示例

tstring s = _T("Hello, world");
_tprintf(_T("s = %s\n"), s.c_str());

c_str() 返回 const TCHAR*,完美匹配 _tprintf。

MFC/ATL 的 CString 對比

CString 內部同樣用模板 CStringT<TCHAR, StrTraitMFC<TCHAR>> 實現三種具體化:CStringA/CStringW/CString。

特性STL tstringMFC CString
初始化需用 _T()自動轉換 "foo"/_T("bar")
轉 LPCTSTR顯式 .c_str()隱式轉換運算符
printf 陷阱無隱式轉換,安全需強轉 (LPCTSTR)s 否則輸出亂碼

選擇建議:已用 MFC/ATL 選 CString;純 STL 項目用 tstring;兩者性能差異可忽略。

托管 C++ 中暴露 Union 給 .NET

.NET 不支持原生 union,但可用 StructLayout(LayoutKind.Explicit) + FieldOffset(0) 模擬:

[StructLayout(LayoutKind::Explicit)]
public value struct MyUnion {
    [FieldOffset(0)] int i;
    [FieldOffset(0)] double d;
};

public ref class CUnionClass {
public:
    MyUnion uval;  // 或封裝為屬性隱藏 union 細節
};

C# 調用:


var obj = new CUnionClass();
obj.uval.i = 17;
obj.uval.d = 3.14159;

獲取「我的圖片」目錄

使用 SHGetSpecialFolderPath(ShlObj.h):

TCHAR buf[MAX_PATH];
SHGetSpecialFolderPath(NULL, buf, CSIDL_MYPICTURES, FALSE);

優於直接讀註冊表,兼容所有 Windows 版本。Win2000/XP 在 shell32.dll,舊版需隨程序分發 SHFOLDER.DLL。

封裝類 CSpecialFolder : public CString:

CSpecialFolder mypics(CSIDL_MYPICTURES);
LPCTSTR path = mypics;  // 隱式轉換

可枚舉所有 CSIDL_* 常量對應路徑(收藏夾、字體、歷史、回收站等)。

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