다른 가변 함수에 줄임표 전달
이 질문에 이미 답변이 있습니다.
- C 10 답변 에서 가변 함수 호출 전달
약 30 개의 가변 함수가 있습니다. 각각은 경로를 최종 인수로받습니다. 예 :
bool do_foo(struct *f, int q, const char *fmt, ...)
각 기능에서 확장 된 형식이 특정 크기 이하인지 확인해야합니다. 그래서 나는 몇 개의 문자 vsnprintf()
가 인쇄되지 않았 는지 확인하기 위해 동일한 코드 덩어리를 복사 / 붙여 넣기하고 errno
그에 따라 설정 하고 쓰기에서 벗어날 수 있다는 것을 알게되었습니다.
내가하고 싶은 것은 안전한 크기로 알려진 정적으로 할당 된 (확장 된) 문자열 또는 실패시 새로 초기화 된 문자열을 반환하는 함수를 작성하여 NULL에 대해 검사하는 것입니다. 또한이 검사는 문자열이 문자열의 안전한 크기에 영향을 미치는 절대 경로인지 상대 경로인지 확인해야합니다. 중복 코드가 많고 냄새가 나기 시작했습니다.
내 함수의 항목에서 다른 함수로 생략의 내용을 전달할 수있는 방법이 있습니까? 아니면 va_start()
먼저 호출 한 다음 va_list
을 도우미 함수에 전달해야 합니까?
편집하다:
va_list
나는를 도우미 에게 전달하는 것에 전혀 반대하지 않으며 , 다른 것이 존재하지 않는지 확인하고 싶었습니다. 컴파일러가 가변 인수가 시작되는 위치를 이해하는 것 같아서 전달하도록 말할 수 있는지 궁금했습니다.
할 수 없으며 인수를 va_list
. comp.lang.c FAQ를 참조하십시오 .
일반적으로 C에서 가변 함수 (즉, 가변 개수의 인수를받는 함수)를 작성하는 경우 각 함수의 두 가지 버전을 작성해야합니다. 하나는 생략 부호 ( ...
)를 사용하고 다른 하나는 va_list
. 호출해야 줄임표를 복용 버전은 va_start
, 복용하는 버전 전화 va_list
, 호출 va_end
및 반환. 하나가 다른 버전을 호출하기 때문에 두 버전의 함수간에 코드를 복제 할 필요가 없습니다.
아마도 다음과 같이 가변 매크로를 사용할 수 있습니다.
#define FOO(...) do { do_some_checks; myfun(__VA_ARGS__); } while (0)
NB! 가변 매크로는 C99 전용입니다.
이것이 도움이 될지 모르겠습니다. 참조로 변수에 액세스 할 수 있습니다. 이것은 일종의 교활한 속임수이지만, 불행히도 최종 함수 정의에서 줄임표를 사용할 수 없습니다.
#include <stdio.h>
void print_vars(int *n)
{
int i;
for(i=0;i<=*n;i++)
printf("%X %d ", (int)(n+i), *(n+i));
printf("\n");
}
void pass_vars(int n, ...)
{
print_vars(&n);
}
int main()
{
pass_vars(4, 6, 7, 8, 0);
return 0;
}
내 PC에서 출력
$ ./a.out
BFFEB0B0 4 BFFEB0B4 6 BFFEB0B8 7 BFFEB0BC 8 BFFEB0C0 0
va_list를 도우미에게 전달해야합니다.
참고 URL : https://stackoverflow.com/questions/695982/passing-an-ellipsis-to-another-variadic-function
'IT Share you' 카테고리의 다른 글
Angular $ scope. $ apply vs $ timeout as a safe $ apply (0) | 2020.11.08 |
---|---|
Android 에뮬레이터 : qemu-system-i386.exe : goldfish_battery_read : 잘못된 오프셋 (0) | 2020.11.08 |
Apache RewriteRule 지시문에서 환경 변수를 설정할 때 변수 이름 앞에 "REDIRECT_"가 붙는 이유는 무엇입니까? (0) | 2020.11.08 |
동시 JUnit 테스트 (0) | 2020.11.08 |
새 DbContext ()는 언제 만들어야합니까? (0) | 2020.11.08 |