C/C++関数パラメータのスタック順序、計算順序と可変パラメータの実現
関数パラメータのスタック順序
-
#include
-
void foo(int x, int y, int z)
-
{
-
printf(
"x = %d at [%X]
", x, &x);
-
printf(
"y = %d at [%X]
", y, &y);
-
printf(
"z = %d at [%X]
", z, &z);
-
}
-
int main(int argc, char *argv[])
-
{
-
foo(
100,
200,
300);
-
return
0;
-
}
:
x = 100 at […60]
y = 200 at […64]
z = 300 at […68]
,C , , 。 , , !。 , C :
C , , , . .
:stdcall , VARARG , C , .
(1)_stdcall Pascal C , Win32 Api , , 。VC , ”@” 。 int f(void *p) –>> _f@4( ) WIN32 API , , wspintf C , stdcall
(2)C ( __cdecl )(The C default calling convention) , 。 ( , vararg ( printf) )。 , 。 _cdecl C C++ 。 , _stdcall 。 。VC 。
(3)__fastcall , ( , ECX EDX (DWORD) , , ), , 。__fastcall ,VC ”@” , ”@” 。
(4)thiscall ”C++” 。this CX/ECX , 。thiscall , 。
(5)naked call。 1-4 , , ESI,EDI,EBX,EBP , 。
, PASCAL . PASCAL , 。
__cdecl 。C , , , , , 。 , , , 。
-
float averge(int n_values, ...)
-
{
-
va_list var_arg;
-
//
-
va_start(var_arg, n_values);
// va_list , 2
-
//
-
for(::)
-
sum += va_arg(var_arg,
int);
//
-
// ,
-
va_end(var_arg);
-
}
: , 。 , , 。
, 。 ,C++ 。 。
int z = add(++x,x+y); 。
: ,C
References
[1]http://blog.sina.com.cn/s/blog_54f82cc2010133mn.html
:https://blog.csdn.net/sunbibei/article/details/49160579