第一次课

自定义别名

CUI程序 GUI程序

SAL 语法, 主要是出参, 入参

#define BYTE  char*
BYTE a, b; // a是char *, b是char类型

typedef  char* BYTE;
BYTE a, b;	// a, b都是char*类型
typedef unsigned short WORD;

typedef unsigned int DWORD; 

typedef DWORD* PDWORD;	// 短指针

typedef PDWORD LPWORD;	// 长指针, 现在短指针没区别, 为了兼容性, 除此之外还有近指针, 远指针

typedef void* PVOID; 

linux所有资源可抽象为file descriptor(fd), 文件句柄

windows所有资源可抽象为HANDLE, 指向内存中的对象

typedef int HANDLE;

typedef HANDLE HMODULE;

typedef HANDLE  HINSTANCE;

typedef SYSTEMTIME* PSYSTEMTIME;
typedef PSYSTEMTIME LPSYSTEMTIME;

字符集处理

字符串定义类型

typedef char* PSTR;
typedef PSTR LPSTR;

typedef const char* PCSTR;
typedef PCSTR LPCSTR;

typedef unsigned short wchar_t;		// 两个字节的char, 宽字符
typedef wchar_t* PWSTR;
typedef PWSTR LPWSTR;

typedef const wchar_t* PCWSTR;
typedef PCWSTR LPCWSTR;

typedef wchar_t WCHAR;			// 微软单独给wchar_t起个别名 

char a = 'A';			// 没问题
char a = '张';			// 存取上可能有乱码
wchar_t a = L'张';				// unicode编码, 两个字节
const wchar_t pstr = L"asdf"; 	// 引号前+L, 这样每个字母占两个字节, 
// 有的函数要传入宽字符字符串, 这时可在字符前加L, 例如CreateProcess(), 第一个字符是宽字符

windows上其实不存在CreateProcess, 这是一个宏, 会根据字符集类型展开, 可在工程里设置字符集, 默认unicode

通过宏定义来指定自定义类型指向字符集

#ifdef UNICODE
#define CreateProcess  CreateProcessW
#else
#define CreateProcess  CreateProcessA
#endif // !UNICODE

#ifdef UNICODE
#define PCTSTR  PCWSTR
#else
#define PCTSTR  PCSTR
#endif // !UNICODE

#ifdef UNICODE
#define PTSTR  PWSTR
#else
#define PTSTR  PSTR
#endif // !UNICODE


#ifdef UNICODE
#define TCHAR  wchar_t
#else
#define TCHAR  char
#endif // !UNICODE

// TCHAR* 等同于 PTSTR 
// 定义UNICODE宏时等同于PWSTR
// 没定义UNICODE宏时等同PSTR

包装

#ifdef UNICODE
#define TEXT(x) L##x    // C语言语法, 意思是把它两个连接在一起
#else
#define TEXT(x) x
#endif

#define _T(x) TEXT(x)   // 对TEXT进一步进行包装

CreateProcess(_T("HelloWorld"), L"haha");		// 推荐使用包裹性, 而不是直接在字符串前放L, 这样可以根据字符集进行切换
CreateProcess(TEXT("HelloWorld"), L"haha");

使用CreateProcessA时, 操作系统会把字符显示转换为宽字符, 然后再调用CreateProcessW, 为了效率使用CreateProcessW

#ifdef UNICODE
#define _tcslen  wcslen
#else
#define _tcslen  strlen
#endif // !UNICODE
#ifdef UNICODE
#define tstring std::wstring 
#else
#define tstring std::string
#endif // !UNICODE

这样使用tstring兼容两个字符集

atoi("88") = 88;

界面上如果是宽字符则是atoi(L"88"), 这时这个函数失效, 应使用_wtoi(L"88")

_tstoi(_T("88"))这么使用则可以根据字符集动态的转换

vs快捷键

Ctrl + K + FVS 格式化代码的快捷键

CTR + SHIFT + SPACE 函数提示

原文地址:https://www.cnblogs.com/hesper/p/10597253.html