2016-06-02 3 views
0

Я скомпилировал приведенный ниже код в 32-битном и 64-битном. проблем нет в 32-битном, но я получаю ошибку компилятора в 64-битном режиме. , пожалуйста, помогите мне в устранении ошибки без использования клеветнической функции, такой как va_arg.Ошибка 64-битного компилятора в переменной va_list

#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. 

    [[email protected] ~]$ 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â) 
    [[email protected] ~]$ 
+0

"... без использования клеветнической функции"? Что такое «клеветническая функция» и почему «va_arg» внезапно «оклеветали»? И как это более «клеветнировано», чем «va_start» и «va_end», которые вы уже используете? И где вы даже поняли, что вы можете применять арифметические операции к объекту 'va_list'? – AnT

ответ

0

Что вы делаете, это не переносимо. Использование va_arg - единственный способ, разрешенный стандартом. Вы полагаетесь на детали того, как va_list реализован на одной архитектуре, что не совпадает с тем, как она находится на другой архитектуре.