-
Notifications
You must be signed in to change notification settings - Fork 20
/
README.txt
177 lines (146 loc) · 5.28 KB
/
README.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
一 NMAKE和Makefile
1.1 NMAKE - 命令解释器,根据Makefile文件中
定义的脚本,完成项目的编译等操作。
1.2 Makefile - 定义编译/链接等脚本语言。
1.3 Makefile文件的编写
1.3.1 基本语法规则
window.exe:window.obj // 依赖行
cl.exe window.c /c // 命令行
link.exe window.obj user32.lib
window.exe的依赖项是window.obj,如果
window.obj被重新改写,window.exe将重新
生成.
通过时间戳(time stamp)判断程序是否需
要重新编译链接,如果当文件修改最后时间
与时间戳不同,将会重新编译链接.
1.3.2 执行过程
1 NMAKE首先找到第一个依赖行,根据依赖
行之间的关系,建立依赖树。例如:
A:B
B:C
C:D
NMAKE会建立对应的依赖树
A
|-B
|-C
|-D
2 在树建好后,NMAKE会首先执行D的命令行,
然后依次执行父结点的命令行
3 在A的命令执行结束后,退出NMAKE.
4 如果需要执行指定依赖行,需要在执行
NMAKE时增加依赖行的名称
NMAKE /f Makefile.mak B <--指定从B执行
1.4 使用
1.4.1 NAMKE指定文件名
NMAKE /f Makefile.mak
1.4.2 使用缺省文件名Makefile
NMAKE在执行时会自动查找这个文件.
二 字符编码
2.1 编码的历史
2.1.1 ASCII 0-127 7位表示
2.1.2 ASCII扩展码 0-255 8位表示
代码页:通过代码页来切换对应的
字符
2.1.3 双字节字符集 DBCS
使用一个或两个字节表示字符.
"A中B国"
12 1 2
A: 0x41 中:0x8051
B: 0x42 国:0x8253
1 2 3 4 5 6
0x41 0x80 0x51 0x42 0x82 0x53
A 中 B 国
2.1.4 Unicode
全部使用2个字节表示字符
"A 中 B 国"
2 2 2 2
A: 0x0041 中:0x8051
B: 0x0042 国:0x8253
1 2 3 4 5 6 7 8
41 00 51 80 42 00 53 82
内存/硬盘等资源占用变大.
对编程支持度.
2.2 C语言和编码
2.2.1 单字节的字符和字符串
char cText = 'A';
char * pszText = "ABCD";
2.2.2 宽字节的字符
wchar_t cText = 'A'
wchar_t * pszText = L"ABCD";
2.2.3 相关函数
单字字符的函数,对应有多.宽字节的函数.
strlen wcslen mbslen
printf wprintf
2.2.4 TCHAR
为了程序中可以方便的支持的Unicode和多字节
字符等,所以使用TCHAR来定义字符和字符串.
根据_UNICODE宏开关,会将TCHAR编译成不同字符
类型.
#ifndef _UNICODE
typedef char TCHAR
#define __T(x) x
#else
typedef wchar_t TCHAR
#define __T(x) L##x
#endif
使用时,要增加TCHAR.H头文件支持,使用
_UNICODE 宏开关进行编译
CL window.c /D_UNICODE
#define _UNICODE
#include "tchar.h"
定义方式:
TCAHR * pszText = __T("ABCDEF");
代码使用:使用UNICODE宏开关,通知
编译器选择编译的代码.
#ifndef _UNICODE
int nLen = strlen( pszText );
#else
int nLen = wcslen( pszText );
#endif
2.2.5 Unicode的控制台打印
BOOL WriteConsole(
HANDLE hConsoleOutput, //控制台输出流的句柄
CONST VOID *lpBuffer,//输出的字符串的指针
DWORD nNumberOfCharsToWrite,//输出的字符串的长度
LPDWORD lpNumberOfCharsWritten,
// 返回已输出字符的数量
LPVOID lpReserved ); // 保留值
2.3 Win32程序与编码
2.3.1 Win32 API的定义
每个API对多字节字符和UNICODE分别有
不同的版本.
MessageBox
MessageBoxA 多字节字符
MessageBoxW UNICODE字符
2.3.2 字符的定义,使用TEXT, 由Winnt.h提供定义
#ifdef UNICODE
#define __TEXT(quote) L##quote
#else /* UNICODE */
#define __TEXT(quote) quote
#endif /* UNICODE */
TCHAR * pszText = TEXT( "ABCD" );
2.3.3 字符转换
int WideCharToMultiByte(
UINT CodePage, //代码页
DWORD dwFlags, //转换方式
LPCWSTR lpWideCharStr, //需要被转换WCHAR地址
int cchWideChar, //需要被转换WCHAR的长度
LPSTR lpMultiByteStr,//用于存放转换后的结果BUFF
int cchMultiByte, //BUFF的长度
LPCSTR lpDefaultChar,//使用的缺省字符串的地址
LPBOOL lpUsedDefaultChar //缺省字符串被使用的标识
);
int MultiByteToWideChar(
UINT CodePage,// 代码页
DWORD dwFlags,// 转换方式
LPCSTR lpMultiByteStr, // 需要被转换CHAR地址
int cchMultiByte,//需要被转换CHAR的长度
LPWSTR lpWideCharStr,//用于存放转换后的结果BUFF
int cchWideChar );//BUFF的长度
使用方法:
1 将要转换的字符串,传递给函数,从
返回值中获取转换后字符串的长度。
2 分配字符串空间
3 再次调用函数,并将分配的空间传递给
函数,获取结果.