2016-07-14 5 views
-3

사용자 정의 구조와 다양한 유형의 인수 (ints/strings/다른 사용자 정의 구조 ...)를 사용하는 C 함수가 있습니다. 구조 때문에 함수는 각 인수를 처리하기 위해 인수의 유형을 판별 할 수 있습니다.함수에 변수 매개 변수 전달

void doStuff(MyStruct *S,...){ <function code> } 

이제 "doStuff"에 'n'개의 상수 인수를 전달할 수있는 다른 함수가 필요합니다. 나는. 이 같은 :의 va_list이처럼 사용할 수 없기 때문에

void useDoStuff(Mystruct *S, int n){ //lets say n=4 
    va_list arguments; 
    int i; 
    for(i = 0 ; i < n ; i++){ 
     if(i%2) arguments.add(6); //example condition for the arguments 
     else arguments.add("Hello"); 
    } 
    doStuff(S, arguments); // doStuff(S, "Hello", 6, "Hello", 6); 
} 

는 당연히이 실 거예요 작업 (만 약에 사용 필요한 것 '시각화'). 불행하게도 구조체 나 'doStuff'함수를 변경할 수 없기 때문에 해결 방법을 찾아야합니다. 그런 해결 방법이 있습니까?

+6

이것은 C가 아니며 C++입니다 (C에는 명시 적 참조가 없습니다). 이것은 XY 문제입니다. 왜 이질적인 인수 목록을 만들려고합니까? 'doStuff'의 _actual_ 정의는 무엇입니까? – Tim

+0

네가 맞다. C에서 참조가 없다. (예제에서 포인터 대신 사용 된 이유는 모르겠다.) 어쨌든 doStuff이하는 일은 실제로 중요하지 않습니다. 요점은 특정 조건을 통과하는 알려지지 않은 수의 상수 인수를 전달해야한다는 것입니다. –

+0

인용구 : "당연히 이것은 작동하지 않을 것입니다. 왜냐하면 va_list는 이와 같이 사용할 수 없기 때문에 (필요한 것만을 '시각화하는'용도로만 사용됩니다.)". 제 말은 ... va_list에 "추가"기능이 있습니까? - 아니. –

답변

2

C는 가변 인수 목록을 동적으로 구성하기위한 메커니즘을 정의하지 않습니다. 일반적으로 컴파일러는 구현의 특정 메커니즘을 사용하여 호출 양쪽에서 인수 목록을 처리하는 varargs 호출을 일반 함수 호출로 변환합니다. 이를 위해 컴파일러는 각 호출에 대한 실제 인수가 무엇인지 알아야합니다.

모든 것이 궁극적으로 varargs 함수를 거쳐야하는 경우 여러 가지 대체 함수 호출을 작성하고 실행할 함수를 동적으로 선택하거나 여러 함수 호출을 통해 작업을 수행하는 등 다양한 옵션이 있습니다. 그것들을 결합하는 것이 가능할 수도 있습니다.

그러나 varargs 함수의 동작 중 적절한 부분을 직접 계산할 수 있는지 고려해보십시오. 그런 다음 변수 인수 대신 구조체 배열 형태로 사용할 데이터를 받아들이는 하나 이상의 대체 프론트 엔드를 제공 할 수 있습니다.

관련 문제