IT Share you

다른 가변 함수에 줄임표 전달

shareyou 2020. 11. 8. 11:34
반응형

다른 가변 함수에 줄임표 전달


이 질문에 이미 답변이 있습니다.

약 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

반응형