我只学过C入门,只做过课后习题,最近刚学windows下的C。
但书上第一个程序我就看不懂了
int WINAPI WinMain()
这里的WINAPI我从来没见过这种用法,网上查了下其实是指定__cdecl或__stdcall等这样的函数调用约定,但即使是看了大篇文章后我还是不懂,主要是这些话:
不论__stdcall还是__cdecl函数参数都是从右向左入栈的,并且由调用者完成入栈操作。对于__stdcall方式被调用者自身在函数返回前清空堆栈;而__cdecl则由调用者维护内存堆栈,所以调用者函数生成的汇编代码比前一种方式长。
我想知道上述的调用者/被调用者是人(我自己)还是函数?这些入栈/清空堆栈的操作指的是不是要在申请动态内存后要记得free()掉?不然指的是什么?
你都已经查到 __stdcall这一步了,再往下多查一步不就知道了么。
调用者(caller)和被调用者(callee)都是指函数。入栈清栈指的是函数调用参数传递的方式。清栈职责在caller这边,意思就是:
foo(123);
转换成汇编是:
push 123;
call foo;
add $4,%esp; #将Stack Pointer %esp 加4即是清栈
#4表示32位下4个字节一个word
如果职责在callee那边,上面最后一行就移到foo中:
foo:
# do something
add $4,%esp
ret
后一种方式一个函数只能接受固定个数的参数,因为编译时就需要确定 add x,%esp中x到底是几。
哦,对了,这些都是编译器的行为,程序员根本不需要关心。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。