2016-06-02 2 views
0

아래의 코드를 32 비트 및 64 비트로 컴파일했습니다. 32 비트에서는 문제가 없지만 64 비트 모드에서는 컴파일러 오류가 발생합니다. va_arg와 같은 중상 기능을 사용하지 않고 오류를 제거하는 데 도움을주십시오. 뭐변수 va_list에 대한 64 비트 컴파일러 오류

#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이 하나의 아키텍처에 어떻게 구현되어 있는지에 대한 세부 정보에 의존하고 있습니다. 다른 아키텍처의 아키텍처와 동일하지 않습니다.

관련 문제