이것은 이상한 질문이지만 다른 기능으로 전달하기 전에 va_list
의 내용을 조작하는 표준 방법이 있습니까? 내가, 내가 이제 결과 (10)를 얻을 수의 대신 직접 vsum
를 호출, sum
중간 함수를 호출한다고 가정 할 것으로 예상 sum
sum(4, 1, 2, 3, 4)
로 호출하는 경우가변 인수를 조작하는 표준 방법은 무엇입니까?
int vsum(int n, va_list ap) {
int total = 0;
for (int i = 0; i < n; ++i) {
total += va_arg(n, int);
return total;
}
int sum(int n, ...) {
va_list ap;
va_start(ap, n);
int total = vsum(n, ap);
va_end(ap);
return total;
}
: 예를 들어, 나는 두 가지 기능 sum
및 vsum
이 있다고 가정 , vsum_stub
다음을 수행한다 : 나는 sum(4, 1, 2, 3, 4)
를 호출 할 때
int vsum_stub(int n, va_list ap) {
va_list temp_ap;
va_copy(temp_ap, ap);
for (int i = 0; i < n; ++i) {
int *arg = &va_arg(ap, int);
*arg += 2;
}
va_end(temp_ap);
return vsum(n, ap);
}
지금, 나는에서 vsum_stub
단위로 모든 값 때문에, 결과 (20)를 다시 얻어야한다210 by 2. 이것은 va_arg
의 결과 주소를 취할 수 없기 때문에 물론 컴파일되지 않습니다. 그래도 이렇게 할 수있는 또 다른 방법이 있습니까? 나는 C99에서 일하고있다.
배경 : 나는 데이터를보다 효율적인 형식으로 힙에 저장 될 수 있도록 몇 가지 포인터 변환을 수행하는 라이브러리에서 일하고 있어요
. 프로그램은 호출을 printf
과 같은 라이브러리 함수로 변환하여 내 스텁 함수 (예 : hc_printf
)로 변환하는 사용자 정의 변환으로 컴파일됩니다. hc_printf
은 실제 printf
함수에 인수를 전달하기 전에 포인터 인수 (%s
용 문자열)를 변환해야합니다.
편집 : 다음은 코드 예제입니다. 문자열이 foo
이라고 가정 해 봅시다. foo
은 가짜 포인터를 반환하는 malloc
의 수정 된 버전으로 동적으로 할당됩니다. 컴파일러는 가짜 포인터를 처리 할 수 있도록 프로그램을 수정합니다. 그래서이 작품 : 나는 (의사의)이 같은 fake_vprintf
함수를 작성 할
char *foo = fake_malloc(4);
fake_strcpy(foo, "foo");
:
int fake_vprintf(const char *format, va_list args) {
for each pointer argument p in args
translate p to q, a real pointer to contiguous memory
replace p with q in args
}
return vprintf(format, args);
}
프로그램은 가짜 포인터를 사용하여 단지 원래 vprintf
처럼 fake_vprintf
을 부를 것이다. fake_vprintf
은 가짜 포인터를 실제 vprintf
이 사용할 수있는 실제 포인터로 변환합니다.
'int * arg = va_arg (ap, int *);'가 아닌'int * arg = & va_arg (ap, int) – dirkgently
@dirkgently, 아니요, 인수 목록의 실제 매개 변수는 int입니다. 그 예제에서 내 의도는 그 값을 바꿀 수 있도록리스트 안에 그 int에 대한 포인터를 얻는 것이었다. –
'vsum_stub'는'int *'의리스트를 취한다고 가정했습니다. 어쨌든 제가 게시 한 코드가 도움이된다고 생각합니까? – dirkgently