C程序高级应用设计读后笔记
Void _cdecl intdos(int intno, union REGS ®s, union REGS ®s);
1.
__cdecl,__stdcall是声明的函数调用协议.主要是传参和弹栈方面的不同.一般c++用的是__cdecl,windows里大都用的是__stdcall(API)
2. __cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
__stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__stdcall可以写成_stdcall。
__fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall
3. _cdecl:函数参数从右边压栈,由函数调用者释栈。c/c++使用
_stdcall:从左边压栈,由函数本身释栈。basic,pascal, winapi,com等使用
4. getchar() 使用getchar()来读取字符时候, 每一次读取完后 都把回车字符 /n 留在读入缓冲区中。所以如果要是在使用getchar()读取字符后在一次使用getchar()读取下一个字符时候 必须在读取前使用getchar()把回车符 /n取走. 即 使用getchar时候 必须 在读取后 再加一个getchar();函数调用。 以防止读取错误。
5. 对文件进行读取操作时候,一定记得把文件指针控制好。