va_list变量

时间:2016-06-02 12:36:42

标签: 64-bit variadic-functions

我已经在32位和64位编译了下面的代码。 在32位没有问题,但我在64位模式下遇到编译器错误。 请帮助我删除错误,而不使用像va_arg这样的诽谤功能。

#include<stdarg.h>
#include<stdio.h>

int sum(int, ...);
int main(void)
{
     printf("Sum of 10, 20 and 30 = %d\n",  sum(8, 10, 20, 30, 40, 50, 60, 70, 80) );
 printf("Sum of 4, 20, 25 and 30 = %d\n",  sum(4, 4, 20, 25, 30) );

 return 0;
}

int sum(int num_args, ...)
{
   int val = 0;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++)
   {
       val += *(int *)((ap += sizeof(int)) - sizeof(int));
   }
   va_end(ap);

   return val;
  }


  error is below.

   [avinta@la-lnx61dev01 ~]$ gcc -m64 var_list1.c
  var_list1.c: In function âsumâ:
  var_list1.c:28: error: invalid operands to binary + (have âva_listâ and     âlong unsigned intâ)
  [avinta@la-lnx61dev01 ~]$

1 个答案:

答案 0 :(得分:0)

你在做什么是不便携的。使用va_arg是标准允许的唯一方式。您依赖于在一个体系结构上实现va_list的详细信息,这与在不同体系结构上的实现方式不同。