由于在ARM嵌入式的工作习惯,在使用VC的时候总是习惯性的要求自己清楚每个变量的数据类型长度。我想这并没什么坏处,但问题就出在WindowsAPI上。
在使用WindowsAPI的时候查看MSDN会发现很多Windows自己定义的数据类型,比如HANDLE这样的,咋一接触,让人莫名奇妙,接触久了之后发现,什么HANDLE啊,不就是个指针嘛,搞得这么神神秘秘的,虽然MSDN中有,但我觉得还是有必要将常用的Windows和ARM C数据类型列举一下以便以后查找:
VC Windows API | ARM C | Comments |
WORD | unsigned short | 32位无符号数 |
INT | int | 32位有符号数 |
UINT | unsigned int | 32位无符号数 |
UINT32 | unsigned int | 32位无符号数 |
DWORD | unsigned int | 32位无符号数 |
PDWORD | unsigned int * | 32位无符号数指针 |
WPARAM | unsigned int * | 32位无符号数指针 |
CHAR | char | ASCII字符 |
UCHAR | unsigned char | 无符号ASCII字符 |
PCHAR | char * | ASCII字符指针 |
PCSTR | const char * | 常量字符指针 |
WCHAR | 无 | 16-bit Unicode 字符 |
BYTE | unsigned char | 8位无符号数 |
PBYTE | unsigned char * | 8位无符号数指针 |
HANDLE | void * | 可指向任何对象的指针 |
VOID | void | 不定型 |
WINAPI | 无 | 指定函数的参数传递规则为__stdcall |
TCHAR | 无 | 这是一个与UNICODE定义相关联的宏定义: #ifdef UNICODE typedef WCHAR TCHAR; #else typedef char TCHAR; #endif |
在使用VC的初期,对于字符串的处理是个很头痛的事情,因为老是涉及到UNICODE的问题,就我的经验,如果你的程序需要支持一种以上的语言,最好选择支持UNICODE,在编程的时候使用TCHAR来声明字符变量,使用LPTSTR来声明字符串,常用的几个字符串函数:
StrStr 在一个字符串中搜索子字符串,大小写敏感
StrStrI 在一个字符串中搜索子字符串,大小写不敏感
StrCpy 字符串拷贝
StrCmp 字符串比较
sprintf 可以将UNICODE字符串转换成ASCII字符串,只要第二个参数使用"%S"即可,注意是大写的S,CharToOem也可以打到同样目的。
wsprintf 则可以将ASCII字符串转换成UNICODE字符串,只要第二个参数使用"%s"即可,注意是小写的s,
使用OemToChar也可以打到同样目的。
对于VOID *也就是HANDLE,在Windows中最好不要理解为空类型指针,个人觉得将它看成万能指针最好,因为他可以表示指向所有类型的指针,而在嵌入式中也会大量使用这样的void *的方式来表示内存地址。