为了更准确更快速的看懂C++代码,委托AI总结了
C++ 常用类型写法和全称:
1. 字符类型
| 写法 | 全称 | 说明 |
|---|---|---|
char |
CHARacter | 8位字符,用于ANSI |
wchar_t |
Wide CHAR acter Type | 宽字符,16位(Windows)/32位(Linux) |
_TCHAR |
Text CHARacter | 通用字符类型,根据编译设置变化 |
TCHAR |
Text CHARacter | 同 _TCHAR |
2. 整数类型
| 写法 | 全称 | 说明 |
|---|---|---|
BOOL |
BOOLean | 布尔类型 (实际上是int) |
BYTE |
BYTE | 8位无符号整数 |
WORD |
WORD | 16位无符号整数 |
DWORD |
Double WORD | 32位无符号整数 |
INT |
INTeger | 32位有符号整数 |
LONG |
LONG | 32位有符号整数 |
UINT |
Unsigned INTeger | 32位无符号整数 |
SHORT |
SHORT | 16位有符号整数 |
3. 指针类型
| 写法 | 全称 | 说明 |
|---|---|---|
LPSTR |
Long Pointer to STRing | 指向ANSI字符串的长指针 |
LPCSTR |
Long Pointer to Constant STRing | 指向ANSI常量字符串的长指针 |
LPWSTR |
Long Pointer to Wide STRing | 指向Unicode字符串的长指针 |
LPCWSTR |
Long Pointer to Constant Wide STRing | 指向Unicode常量字符串的长指针 |
LPTSTR |
Long Pointer to Text STRing | 指向通用字符串的长指针 |
LPCTSTR |
Long Pointer to Constant Text STRing | 指向通用常量字符串的长指针 |
PVOID |
Pointer to VOID | 泛型指针 |
LPVOID |
Long Pointer to VOID | 泛型长指针 |
4. 句柄类型
| 写法 | 全称 | 说明 |
|---|---|---|
HANDLE |
HANDLE | 通用句柄 |
HWND |
Handle to WINdow | 窗口句柄 |
HDC |
Handle to Device Context | 设备上下文句柄 |
HINSTANCE |
Handle to INSTANCE | 实例句柄 |
HMODULE |
Handle to MODULE | 模块句柄 |
HKEY |
Handle to KEY | 注册表键句柄 |
5. 特殊类型
| 写法 | 全称 | 说明 |
|---|---|---|
HRESULT |
Handle RESULT | COM操作结果代码 |
VARIANT |
VARIANT | 自动化变量类型 |
BSTR |
Basic STRing | 自动化字符串 |
GUID |
Globally Unique IDentifier | 全局唯一标识符 |
FILETIME |
FILE TIME | 文件时间结构 |
SYSTEMTIME |
SYSTEM TIME | 系统时间结构 |
6. 字符串宏
| 宏定义 | 说明 |
|---|---|
_T("text") |
通用文本宏 |
TEXT("text") |
通用文本宏 |
L"text" |
Unicode字符串字面量 |
使用示例:
cpp
#include <windows.h>
#include <tchar.h>
void Example()
{
// 字符类型使用
TCHAR szBuffer[MAX_PATH]; // 通用字符缓冲区
LPCTSTR lpszText = _T("Hello"); // 指向常量通用字符串
// 整数类型使用
DWORD dwSize = 1024; // 32位无符号整数
BOOL bSuccess = TRUE; // 布尔值
// 句柄使用
HINSTANCE hInstance = GetModuleHandle(NULL); // 获取模块句柄
HWND hWnd = FindWindow(NULL, _T("Calculator")); // 查找窗口句柄
// 字符串操作
_tcscpy(szBuffer, _T("Test")); // 通用字符串拷贝
// 根据编译模式,TCHAR 会自动转换为 char 或 wchar_t
#ifdef _UNICODE
// 编译为Unicode时,TCHAR = wchar_t
wprintf(L"Unicode mode: %s\n", szBuffer);
#else
// 编译为ANSI时,TCHAR = char
printf("ANSI mode: %s\n", szBuffer);
#endif
}
历史背景
这些类型主要来源于Windows API的演变:
-
"Long Pointer":源于16位Windows时代,区分近指针和远指针
-
"TCHAR"系统:为了解决ANSI和Unicode编码的兼容性问题
-
匈牙利命名法 :通过变量名前缀表明类型(如
sz表示字符串,h表示句柄等)
在现代C++开发中,推荐使用标准类型如std::string、std::wstring等,但在Windows API编程中这些传统类型仍然很常见。
Windows编程中的匈牙利命名法
sz - 字符串(String Zero)
全称:String Zero-terminated
cpp
// sz 表示以零结尾的字符串
char szFileName[MAX_PATH]; // 以NULL结尾的ANSI字符串
WCHAR szUserName[32]; // 以NULL结尾的Unicode字符串
为什么用 "sz":
-
s = String(字符串)
-
z = Zero-terminated(以零结尾)
-
表示这是一个以NULL字符('\0')结尾的C风格字符串
历史背景:
在C语言中,字符串通常以NULL字符标记结束:
cpp
char str[] = "Hello"; // 实际存储: 'H','e','l','l','o','\0'
sz前缀提醒开发者这是一个传统的C字符串,而不是面向对象的字符串类。
h - 句柄(Handle)
全称:Handle
cpp
// h 表示各种系统资源的句柄
HWND hWnd; // 窗口句柄
HANDLE hFile; // 文件句柄
HINSTANCE hInst; // 实例句柄
HDC hDC; // 设备上下文句柄
为什么用 "h":
-
表示这是一个系统资源的引用标识符
-
句柄不是指针,而是系统内部表的索引
-
开发者不应该直接操作句柄的值
其他常见的匈牙利命名法前缀
| 前缀 | 全称 | 含义 | 示例 |
|---|---|---|---|
b |
Boolean | 布尔值 | BOOL bSuccess |
dw |
Double Word | 32位无符号整数 | DWORD dwSize |
w |
Word | 16位无符号整数 | WORD wParam |
by |
Byte | 8位无符号整数 | BYTE byData |
n |
Number | 整数 | int nCount |
i |
Index | 索引 | int iIndex |
p |
Pointer | 指针 | char* pszName |
lp |
Long Pointer | 长指针 | LPSTR lpszText |
c |
Count | 计数 | int cItems |
cx/cy |
Coordinate X/Y | 坐标 | int cxWidth, cyHeight |
x/y |
Coordinate | 坐标 | int xPos, yPos |
rgb |
Red Green Blue | 颜色值 | COLORREF rgbColor |
使用示例
cpp
#include <windows.h>
void ExampleFunction()
{
// 字符串相关
TCHAR szAppName[64]; // 应用程序名称(零结尾字符串)
LPCTSTR lpszClassName; // 长指针指向常量字符串
char* pszBuffer; // 指针指向字符串
// 句柄相关
HWND hMainWnd; // 主窗口句柄
HDC hMemoryDC; // 内存设备上下文句柄
HANDLE hFile; // 文件句柄
HINSTANCE hInstance; // 实例句柄
// 数值相关
DWORD dwFileSize; // 32位文件大小
BOOL bFileOpened; // 布尔标志
INT nItemCount; // 项目计数
WORD wMagicNumber; // 16位魔数
}
cpp
// 复杂的匈牙利命名法示例
BOOL CreateMainWindow(
HINSTANCE hInstance, // 输入:实例句柄
LPCTSTR lpszWindowName, // 输入:窗口名称字符串
int nWidth, // 输入:宽度
int nHeight, // 输入:高度
HWND* phWnd // 输出:创建的窗口句柄指针
)
{
TCHAR szClassName[64] = _T("MainWindowClass");
BOOL bResult = FALSE;
DWORD dwStyle = WS_OVERLAPPEDWINDOW;
// ... 创建窗口的逻辑
return bResult;
}
现代开发中的变化
虽然匈牙利命名法在历史上有其价值,但在现代C++开发中:
-
不再强制使用:智能指针、RAII等现代特性减少了对原始类型前缀的需求
-
仍然有用:在Windows API编程和系统级编程中仍然常见
-
类型安全:现代C++更依赖类型系统而不是命名约定
cpp
// 现代C++风格(推荐)
class Application
{
private:
std::wstring m_windowName; // 使用有意义的名称
HWND m_mainWindow; // 保留h前缀用于句柄
int m_width; // 不使用n前缀
int m_height;
bool m_isRunning; // 使用bool而不是BOOL
};
总结 :sz和h这些前缀是Windows编程历史的产物,了解它们有助于阅读和维护遗留代码,但在新项目中应该根据团队规范谨慎使用。
注:AI总结难免个别瑕疵,一切以个人尝试为准。