1. Window API 函数
Windows API 提供的函数,有ANSI和UNICODE 版本的,需要注意的是,你调用一个函数时,这个函数名可能是定义好的一个macro罢了
#define MessageBox MessageBoxA
#define MessageBox MessageBoxW
#undef MessageBox
取消macro
注意你使用的是什么编码
2.cl 调用Windows 函数的过程
一般,你在.cpp文件中使用到的函数,都是CRT去间接调用的,为什么间接?
因为,不是操作系统直接调用,而是通过CRT -> 操作系统 再进行调用的。具体原因,是为了实现C/C++跨平台特性,比如,让更多的操作系统支持同名的一个printf函数。
同理,cl 编译器,在编译代码的过程中,第一件事情,就是设定好windows 平台下的CRT ,这个CRT 内包含了很多Windows提供的C语言接口;当你调用的windows函数在CRT中没有是,需要自己添加.lib文件到编译器中,方法是
cl foo.exe user32.lib
这样,user32.lib中封装好的windows平台调用,就植入到你的foo.exe中了,然后就可以使用API函数
3.windows 默认call stack 大小1MB
call stack,如果是默认,只有1MB,也就是说,从函数调用的地址开始(包括函数中传入的参数),到函数执行的最后一行代码,不能超过1MB大小;
void foo(int a, int b){ params... }
可以使用cl Compiler Switches 调节这个大小
cl -F2*1024*1024
4. x64位编译器的字节排序
8个字节位一个单位,如果不够,那就多浪费几个字节空间,这回造成空间浪费,比如:
char a[6] = {}; char b[8] = {};
a地址x00;b地址x08,0x06/0x07两个字节单位被浪费掉了
5.PeekMessage() vs GetMessageA()
GetMessageA会一直等待这个队列中的消息,会阻塞
PeekMessage不会等待,也不阻塞