由于在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 *的方式来表示内存地址。