[c] C 기본 인수

C의 함수에 기본 인수를 지정하는 방법이 있습니까?



답변

실제로는 아닙니다. 유일한 방법은 varargs 함수 를 작성하고 호출자가 전달하지 않는 인수의 기본값을 수동으로 채우는 것입니다.


답변

와, 모두가 여기 비관론자 야. 대답은 ‘예’입니다.

그것은 사소한 것이 아닙니다. 결국 우리는 핵심 함수, 지원 구조체, 래퍼 함수 및 래퍼 함수 주위의 매크로를 갖게 될 것입니다. 내 작품에는이 모든 것을 자동화하는 매크로 세트가있다. 흐름을 이해하면 같은 작업을 쉽게 수행 할 수 있습니다.

나는 이것을 다른 곳에 작성 했으므로 여기에 요약을 보완하는 자세한 외부 링크가 있습니다 : http://modelingwithdata.org/arch/00000022.htm

우리는 설정하고 싶습니다

double f(int i, double x)

기본값 (i = 8, x = 3.14)을 취하는 함수로 컴패니언 구조체를 정의하십시오.

typedef struct {
    int i;
    double x;
} f_args;

함수의 이름을 바꾸고 f_base기본값을 설정하고 기본을 호출하는 랩퍼 함수를 ​​정의하십시오.

double var_f(f_args in){
    int i_out = in.i ? in.i : 8;
    double x_out = in.x ? in.x : 3.14;
    return f_base(i_out, x_out);
}

이제 C의 가변성 매크로를 사용하여 매크로를 추가하십시오. 이런 식으로 사용자는 실제로 f_args구조체를 채우고 있다는 것을 알 필요가 없으며 평소와 같이 생각합니다.

#define f(...) var_f((f_args){__VA_ARGS__});

이제 다음 모든 것이 작동합니다.

f(3, 8);      //i=3, x=8
f(.i=1, 2.3); //i=1, x=2.3
f(2);         //i=2, x=3.14
f(.x=9.2);    //i=8, x=9.2

복합 이니셜 라이저가 정확한 규칙의 기본값을 설정하는 방법에 대한 규칙을 확인하십시오.

작동하지 않는 한 가지 : 결 f(0)측값과 0을 구분할 수 없기 때문입니다. 내 경험상, 이것은 조심해야 할 것이지만, 필요가 발생할 때-기본값이 실제로 0 인 시간의 절반을 처리 할 수 ​​있습니다.

명명 된 인수와 기본값이 실제로 C에서 코딩을 더 쉽고 재미있게 만든다고 생각하기 때문에 이것을 작성하는 데 어려움을 겪었습니다. 그리고 C는 매우 간단하고 여전히 모든 것을 가능하게하기에 충분합니다.


답변

예. 🙂 그러나 당신이 기대하는 방식이 아닙니다.

int f1(int arg1, double arg2, char* name, char *opt);

int f2(int arg1, double arg2, char* name)
{
  return f1(arg1, arg2, name, "Some option");
}

불행히도 C는 메소드에 과부하를 허용하지 않으므로 두 가지 다른 함수가 생깁니다. 여전히 f2를 호출하면 실제로 기본값으로 f1을 호출하게됩니다. “반복하지 마십시오”솔루션으로 기존 코드를 복사 / 붙여 넣기하지 않아도됩니다.


답변

기본값으로 명명 된 매개 변수 (전용)를 사용하는 함수를 만들 수 있습니다. 이것은 bk.의 답변의 연속입니다.

#include <stdio.h>

struct range { int from; int to; int step; };
#define range(...) range((struct range){.from=1,.to=10,.step=1, __VA_ARGS__})

/* use parentheses to avoid macro subst */
void (range)(struct range r) {
    for (int i = r.from; i <= r.to; i += r.step)
        printf("%d ", i);
    puts("");
}

int main() {
    range();
    range(.from=2, .to=4);
    range(.step=2);
}    

C99 표준은 나중에 초기화시 이름이 이전 항목보다 우선 함을 정의합니다. 우리는 또한 표준 위치 매개 변수를 가질 수도 있습니다. 매크로와 함수 서명을 적절히 변경하십시오. 기본값 매개 변수는 명명 된 매개 변수 스타일에서만 사용할 수 있습니다.

프로그램 출력 :

1 2 3 4 5 6 7 8 9 10
2 3 4
1 3 5 7 9


답변

OpenCV 는 다음과 같은 것을 사용합니다.

/* in the header file */

#ifdef __cplusplus
    /* in case the compiler is a C++ compiler */
    #define DEFAULT_VALUE(value) = value
#else
    /* otherwise, C compiler, do nothing */
    #define DEFAULT_VALUE(value)
#endif

void window_set_size(unsigned int width  DEFAULT_VALUE(640),
                     unsigned int height DEFAULT_VALUE(400));

사용자가 자신이 무엇을 작성해야할지 모른다면이 방법이 도움이 될 수 있습니다.

사용 예


답변

아니.

최신 C99 표준조차도이를 지원하지 않습니다.


답변

아니요, C ++ 언어 기능입니다.