不是从右往左压的吗。c/c++编译器默认使用__cdecl调用方式,而它就是从右往左压栈的。你可以参考下http://blog.163.com/zhaoxin851055@126/blog/static/8112929820102523854278/这上面的。
参数按照从右向左顺序压栈,因此最开始的参数在最接近栈顶的位置。因此当采用不定个数参数时,第一个参数在栈中的位置肯定能知道,只要不定的参数个数能够根据第一个后者后续的明确的参数确定下来,就可以使用不定参数,例如:
int sprintf(char* buffer,const char* format,...)
由于所有的不定参数都可以通过format确定,因此使用不定个数的参数是没有问题的。在__cdecl调用方式中,函数本身不清理堆栈,调用者负责清理堆栈。由于这种变化,C调用约定允许函数的参数的个数是不固定的,这也是C语言的一大特色
参考http://www.bccn.net/Article/kfyy/vc/jszl/200708/5861.html
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
不是从右往左压的吗。
c/c++编译器默认使用__cdecl调用方式,而它就是从右往左压栈的。
你可以参考下http://blog.163.com/zhaoxin851055@126/blog/static/8112929820102523854278/这上面的。
参数按照从右向左顺序压栈,因此最开始的参数在最接近栈顶的位置。因此当采用不定个数参数时,第一个参数在栈中的位置肯定能知道,只要不定的参数个数能够根据第一个后者后续的明确的参数确定下来,就可以使用不定参数,例如:
int sprintf(char* buffer,const char* format,...)
由于所有的不定参数都可以通过format确定,因此使用不定个数的参数是没有问题的。
在__cdecl调用方式中,函数本身不清理堆栈,调用者负责清理堆栈。由于这种变化,C调用约定允许函数的参数的个数是不固定的,这也是C语言的一大特色
参考http://www.bccn.net/Article/kfyy/vc/jszl/200708/5861.html