昨天晚上睡觉前突然想起了一个问题,我用的开发工具是VC6.0,这是因为,我尝试过很多次安装visual stdio的各个版本,最终都以失败告终,大概是因为的win7版本不怎么好吧,无奈之下只好选用VC6.0。好了,开始今天的主菜。
一、理论知识讲解
1 windows头文件介绍
(a) windows.h——所有的windows头文件的集合,包含了95%以上的windows API函数。
(b) winnt.h——windows字符集头文件
2 资源脚本文件(后缀为.rc的文件),自己指定图标。但是图片格式有要求,必须以.ico为后缀的格式。
(1) 准备一副.ico格式的图标。
(2) 自己动手编写一个.rc脚本文件,我这里写的文件名叫做hello.rc,需要说明的是,现实中不需要自己手动编译,由开发工具自动生成。
<span style="white-space:pre"> </span>100 ICON 130316979.ico
用rc.exe编译器对hello.rc文件进行编译,如果编译成功,就会生成hello.RES二进制文件。
(3)用link.exe连接各个目标文件。
(4) 最终生成的hello.exe文件图标如下
以上是手动指定可执行文件的完整过程,实际中由开发工具自动执行,并不需要这么做,但是作为一个c/c++程序员,这样显得比较专业(勿拍砖啊)!
3 makefile文件介绍
(1)手动写一个makefile文件(.mak后缀的文件)
HELLO:
cl.exe /c hello.c
rc.exe hello.rc
link.exe hello.obj hello.RES user32.lib
(2)执行makefile文件——nmake命令
在命令行输入nmake hello.mak命令,如果成功,就会生成要得到的文件。
实际的makefile文件中可以有多个依赖行。执行makefile文件的时候,系统默认执行第一个依赖行的内容,后面的依赖行都不执行。
HELLO:
cl.exe /c hello.c
rc.exe hello.rc
link.exe hello.obj hello.RES user32.lib
CLEAN:
del *.obj
del *.RES
del *.exe
注:HELLO和CLEAN表示依赖行,这个程序员可以自己指定,可以为任何内容(除汉语)
选择执行依赖行:nmake /f hello.mak CLEAN
注:一种/f表示选择
此外HELLO:CLEAN,表示HELLO依赖于CLEAN,先执行依赖的内容,即先执行CLEAN命令,后执行HELLO命令,炫酷吧。
4 字符编码
ASC —— 7位代表一个字符,128个字符,美国人使用的字符
ASCII —— 8位代表一个字符,256个字符,加入了一些其他国家的字符。
MBCS方式,这是一个编码族
DBCS —— 微软在中国使用的一个编码分支,单双字节混合编码,即英文占用一个字节,汉字占2个字节。(计算机的主流编码方式)
A 我 是 程 序 员
01 0203 0405 0607 0809 0A0B
0102 0304 0506 0708 090A 0B(这种编码方式存在这样的巨大缺陷,也就是乱码)
UNICODE编码族,解决了DBCS编码的问题。
UTF8—— LUNIX编码方式
UCS16——微软采用的方式,全部占用两个字节,英文字符高位补零。
5 宽字节字符
char 每个字符占1个字节或2个字节,采用DBCS编码方式
wchar_t 每个字符占2个字节,采用UNICODE编码方式,wchar_t 实际是 unsigned short 类型,定义时, 需要增加“L”,通知编译器按照双字节编译字符串,采用UNICODE编码。需要使用支持 wchar_t 函数操作宽字 节字符串。例如:
wchar_t * p = L"Hello wchar";
wprintf( L"%s\n", p );
一个小小的例子:
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
/*
* 1 char字符的操作
*/
void C_char()
{
char *p = "肖申克的救赎";
printf("%s\n",p);
}
/*
* 2 wchar_t字符的操作,wcslen()属于windows的API函数,需要包含头文件windows.h
*/
void W_char()
{
wchar_t *p = L"泰坦尼克号";
int nLen = wcslen(p);
wprintf(L"%s %d\n",p,nLen);
}
int main(int argc, char* argv[])
{
C_char();
W_char();
return 0;
}
实际上,微软已经重新定义了一种TCHAR类型的数据类型,根据条件不同,它可以是wchar_t或者char
TCHAR *p = __TEXT("hello");
二、今天没什么代码实践的内容。可能今天的内容有点晕,但是没有关系,权当延伸。
三、
最后留下来一个问题,看看上面的代码能否得到想要的结果。曾经这个问题也困扰了我一阵子,所以我在这里暂且卖一下关子,预知后事如何,且听我下回分解!