programing

줄임표를 다른 변량 함수에 전달

prostudy 2022. 4. 22. 20:54
반응형

줄임표를 다른 변량 함수에 전달

나는 대략 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, callva_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

반응형