C/C++関数パラメータのスタック順序、計算順序と可変パラメータの実現


関数パラメータのスタック順序

   
   
   
   
  1. #include
  2. void foo(int x, int y, int z)
  3. {
  4. printf( "x = %d at [%X]
    "
    , x, &x);
  5. printf( "y = %d at [%X]
    "
    , y, &y);
  6. printf( "z = %d at [%X]
    "
    , z, &z);
  7. }
  8. int main(int argc, char *argv[])
  9. {
  10. foo( 100, 200, 300);
  11. return 0;
  12. }

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 , , , , , 。 , , , 。


   
   
   
   
  1. float averge(int n_values, ...)
  2. {
  3. va_list var_arg;
  4. //
  5. va_start(var_arg, n_values); // va_list , 2
  6. //
  7. for(::)
  8. sum += va_arg(var_arg, int); //
  9. // ,
  10. va_end(var_arg);
  11. }

: , 。 , , 。


, 。 ,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