2009-12-10 5 views
33

적절한 검색 용어를 사용하지 않았기 때문에 명확한 답변을 찾을 수 없었습니다. 그렇다면이 경우 리디렉션하십시오. 함수 매개 변수 목록에서 이전 인수를 매개 변수 목록의 나중 인수에 대한 기본값으로 사용할 수 있습니까? 예 :C/C++ 기본 인수가 이전 인수로 설정되었습니다.

void f(int a, int b = a, int c = b); 

가능한 경우 규칙이 있습니까? C와 C++의 차이점은 무엇입니까?

+6

질문의이 부분에 답하기 위해 C에 기본 인수에 대한 개념이 없습니다 ** –

답변

52

대답은 '아니오, 당신은 할 수 없습니다. 오버로드를 사용하여 원하는 동작을 얻을 수 있습니다.

void f(int a, int b, int c); 
inline void f(int a, int b) { f(a,b,b); } 
inline void f(int a)  { f(a,a,a); } 

마지막 질문의 경우 C는 기본 매개 변수를 전혀 허용하지 않습니다.

+1

왜 두 가지 기능 만 인라인 했습니까? –

+5

@DavidDoria : 주요 과부하가 인라인 될 수 있는지 또는 인라인되어야하는지 여부는 알 수 없습니다. 문제의 범위를 벗어납니다. 다른 사람들은 단순히 주 과부하를 호출하기 때문에 쉽게 인라인 될 수 있습니다. –

25

아니요, 이는 합법적이지 않습니다. C++.

Default arguments are evaluated each time the function is called. The order of evaluation of function arguments is unspecified. Consequently, parameters of a function shall not be used in default argument expressions, even if they are not evaluated.

과 :이 작업은 C++ 표준의 섹션 8.3.6/9에 지정된

int f(int a, int b = a); // error: parameter a used as default argument

을 그리고 C89은 적어도 기본 매개 변수 값을 지원하지 않습니다.

3

불가능합니다.

2

아니요, 그렇게 할 수 없습니다.
"로컬 변수가이 컨텍스트에 표시되지 않을 수 있습니다"라는 오류 메시지가 나타납니다.

7

잠재적 인 해결 방법으로, 당신은 할 수 :

const int defaultValue = -999; // or something similar 

void f(int a, int b = defaultValue, int c = defaultValue) 
{ 
    if (b == defaultValue) { b = a; } 
    if (c == defaultValue) { c = b; } 

    //... 
} 
+0

+1 잘 쓰려고했습니다 –

+0

감사합니다. 다른 대답을 살펴보면 마이크 시모어의 접근 방식이 훨씬 나아 졌다고 생각합니다. –

+2

이것은 런타임에 기본값을 해석합니다. Mike의 접근법은 컴파일 타임에 해결됩니다. 또한 이것은 여기에 int 타입이 특별한 "default"플래그 값 (여기서는 -999)을 가질 수 있다고 가정하고 위험한 것입니다 : 어떤 식 으로든 -999가 실제 값으로 전달되면 예상대로 작동하지 않습니다. .. – galinette

1

불법 구문이므로 그렇게 할 수 있다고 생각하지 않습니다. 그러나 C99 표준을 PDF 형식 (n1136.pdf)으로 문의하십시오.

그러나, 당신은 정적 변수를 선언하고 내 오류를 지적하기위한 함수 내에서 마이클 버에 f

 
static int global_a; 

/* In some other spot where you are calling f(), do this beforehand */ 
/* global_a = 4; f(); */ 

void f(void){ 
    int a = global_a; 
    b = c = a; 
    /* ..... */ 
} 

명예를을 사용하여 같이 static를 사용하여이 문제를 해결받을 수 있습니다 :)

코드를 다시 생각해보고 그런 식으로 변경해야하는 것처럼 들립니다.

호프가 도움이 되었으면 안녕하세요, 탐.

+0

나는 따라하지 않는다. 만약 당신이 이와 같이하면, 사용되지 않기 때문에 매개 변수를 전달할 이유가 없다. –

+0

@Michael Burr : 네, 맞습니다 ... 내 잘못입니다! Meh ... 나는 이것을 적절하게 편집하고 당신의 의견을 언급 할 것이다. 감사! :) – t0mm13b

1

첫 번째 아이디어는 다음과 같이 뭔가를 할 수 있습니다 :

void something(int a, int b=-1, int c=-1){ 
    if(b == -1) 
     b = a; 
    if(c == -1) 
     c = b; 
} 

내가 사용 -1이 기능은 양의 값으로 작동하기 때문에. 그러나 누군가 내 수업을 사용하고 실수로 -1을 보내는 경우? 여전히 컴파일되고 실행되지만 결과는 예측할 수 없습니다.누군가가 그것을 사용하는 경우 그것은 정말 코드에 더 이상 고려하지 않습니다

void something(int a, int b, int c){ 
    /* Do something with a, b and c */ 
} 

void something(int a){ 
    something(a, a, a); 
} 

void something(int a, int b){ 
    something(a, b, b); 
} 

하고, 이렇게하려면 스마트 것은 어떤 기본 인자를 제거하고 대신에 같은 이름이 같은 방법의 무리를하게하는 것 자동 완성 기능이있는 프로그래밍 인터페이스에서 3 가지 프로토 타입을 보여줍니다.