gcc(x64)如何处理可变参数函数中的类型/大小?

时间:2018-04-13 11:13:58

标签: c gcc variadic

可变函数和main()

#include <stdio.h>
#include <stdarg.h>
int f(long x,...)
{ va_list ap;
  int i=0;
  va_start(ap,x);
  while(x)
  { i++;
    printf("%ld ", x);
    x=va_arg(ap,long);
  }
  va_end(ap);
  printf("\n");
  return i;
}

int main()
{ return f(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1L<<63,0);
}

在gcc,linux和x64上:即使f()的参数没有强制转换为64位长,gcc似乎也是正确的。

$ gcc t.c && ./a.out
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -9223372036854775808 

如何?

2 个答案:

答案 0 :(得分:1)

可变参数函数的参数被提升&#34;在Linux x64上为64位值,因此无需在此平台上显式地转换为64位值。

答案 1 :(得分:0)

使其工作的基本代码是

x = va_arg(ap, long);

通过将其改为任何其他类型,你可以很好地射击自己。

char ch = va_arg(ap, char);

根据目标体系结构的规则,每次访问后,这可能会使ap增加一,二,四或八。