匈牙利命名法

匈牙利命名法是Windows程序开发时经常用到/见到的变量/类型命名方法。

例如:下面是winsock2.h中的一个函数的文档:

1
2
3
4
5
6
7
INT WSAAPI WSAAddressToStringW(
[in] LPSOCKADDR lpsaAddress,
[in] DWORD dwAddressLength,
[in, optional] LPWSAPROTOCOL_INFOW lpProtocolInfo,
[in, out] LPWSTR lpszAddressString,
[in, out] LPDWORD lpdwAddressStringLength
);

显然,变量名(类型名)具有某中规律,但:lpsz是什么?LPWSTR又是什么类型?DWORD和LPDWORD有什么区别?可以通过学习匈牙利命名法快速解决这些问题;

  • 匈牙利命名法分为“匈牙利应用命名法”和“系统匈牙利命名法”两种,可同时使用;
  • 由 其他前缀(前前缀) + 匈牙利命名法前缀 + 实际变量/类名 组成;
  • 大小写规则(不是必须的):
    • 类(数据类型)的匈牙利命名法前缀大写,类名大写;也即:全部大写;例如:LPWSTR
    • 变量(对象)的匈牙利命名法前缀小写,变量名只有首字母大写;例如:lpwStr
  • 不同程序项目中的前缀的含义不一定相同,但同一个项目中的前缀含义一定相同
    • 即:弄懂一个前缀的意思,就能快速了解其他变量或类的类型/特征

系统匈牙利命名法

  • 匈牙利命名法的前缀 标识的是数据类型
  • 基础类型
    • iint,整型
    • uunsigned,无符号的
    • bbool,布尔型
    • llong,长的
    • vvoid,空类型
    • n:number,即short,短整型
    • ffpfloat,单精度浮点数
    • ddbdouble,双精度浮点数
    • cchchar,字符型
    • uccb(char byte):无符号字符型
    • ppointer,指针
    • npnear pointer,近程指针
    • fnfunction,函数
    • fsfile stream,文件流
    • kconst,常量
    • eenum,枚举类型
    • ……
  • 有时可以在类型后加数字,代表类型的位数,如:16位无符号整形ui16
  • 其他类型
    • sstring,字符串
    • szstring (with) zero (endings),以\0结尾的字符串
    • arg:range,即array,数组
    • bybyte,字节
    • wword,字
    • dwdouble word,双字
    • qwquarter word,四字
    • Sstruct,结构体
    • CClass,类
    • IInterface,接口
    • XNested Class,嵌套的类
    • xInstance of nested class,嵌套的类的实例
1
2
3
4
5
6
7
8
9
// CRocket:类
class CRocket {
public:
// XMotion:类中的类(嵌套的类),IMotion:接口
class XMotion: public IMotion {
public:
void Fly();
} m_xUnknown; // m_xUnknown:嵌套的类XMotion的一个实例
}
  • Windows API中能够见到许多独特的前缀
    • hhandle,句柄
    • saSocket Address,Socket地址
    • ……
  • 常见的前前缀
    • g_global,全局变量
    • m_member,类的成员变量
    • s_static,静态变量
    • ……

匈牙利应用命名法

  • 匈牙利命名法的前缀 标识的是变量特征或用处
  • 一些前缀的例子
    • ctcounter,计数器
    • cbcount (of) bytes,字节数
    • iindex,下标
    • wwide,宽字符
    • rowrow,行号
    • colcolumn,列号
    • ddistance,距离
    • usunsafe string,不安全的字符串
    • ……
评论