Welcome

首页 / 软件开发 / C语言 / 不定参数在C语言中的应用实例

不定参数在C语言中的应用实例2010-09-23不定参数在中的应用实例:不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替换它。尽管如此,既然大家对它比较感兴趣,我就简单总结一下它的使用和需要注意的常见问题。

刚学C语言的时候,一般人都会首先接触printf函数。通过这个函数,你可以打印不定个数的变量到屏幕,如:

printf("%d", 3);

printf("%d,%d",3,4);

上述代码看似简单,实际上却需要我们解决许多问题。在我们设计printf的时候,我们是不知道到底会传入几个参数的。在这种未知的情况下,我们需要解决下面几个问题:

怎么告诉printf我们会传入几个参数

printf怎么去访问这些参数

函数调用完成后,系统怎么把参数从传递用的堆栈中释放

为了解决这些问题,我们首先要解释cdecl调用约定,所有使用不定参数的函数必须是使用cdecl(全局函数)或者this call(类成员函数)调用约定。该约定对于参数传递规定如下:

参数从右向左入栈(也就是如果你调用f(a,b,c),则c先入栈,然后是b,最后是a入栈)

调用者负责清理堆栈

其中第二点直接解决了前面三个问题中的第三个问题。我们来详细说说其他两个问题。

确定参数的个数

在一个函数中,一般有如下prelog代码:

00401020 push ebp

00401021 mov ebp,esp

00401023 sub esp,48h

执行上述代码之后,func(a,b,c)函数所处的堆栈上下文就变成如下布局: