적절한 검색 용어를 사용하지 않았기 때문에 명확한 답변을 찾을 수 없었습니다. 그렇다면이 경우 리디렉션하십시오. 함수 매개 변수 목록에서 이전 인수를 매개 변수 목록의 나중 인수에 대한 기본값으로 사용할 수 있습니까? 예 :C/C++ 기본 인수가 이전 인수로 설정되었습니다.
void f(int a, int b = a, int c = b);
가능한 경우 규칙이 있습니까? C와 C++의 차이점은 무엇입니까?
적절한 검색 용어를 사용하지 않았기 때문에 명확한 답변을 찾을 수 없었습니다. 그렇다면이 경우 리디렉션하십시오. 함수 매개 변수 목록에서 이전 인수를 매개 변수 목록의 나중 인수에 대한 기본값으로 사용할 수 있습니까? 예 :C/C++ 기본 인수가 이전 인수로 설정되었습니다.
void f(int a, int b = a, int c = b);
가능한 경우 규칙이 있습니까? C와 C++의 차이점은 무엇입니까?
대답은 '아니오, 당신은 할 수 없습니다. 오버로드를 사용하여 원하는 동작을 얻을 수 있습니다.
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는 기본 매개 변수를 전혀 허용하지 않습니다.
왜 두 가지 기능 만 인라인 했습니까? –
@DavidDoria : 주요 과부하가 인라인 될 수 있는지 또는 인라인되어야하는지 여부는 알 수 없습니다. 문제의 범위를 벗어납니다. 다른 사람들은 단순히 주 과부하를 호출하기 때문에 쉽게 인라인 될 수 있습니다. –
아니요, 이는 합법적이지 않습니다. 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은 적어도 기본 매개 변수 값을 지원하지 않습니다.
불가능합니다.
아니요, 그렇게 할 수 없습니다.
"로컬 변수가이 컨텍스트에 표시되지 않을 수 있습니다"라는 오류 메시지가 나타납니다.
잠재적 인 해결 방법으로, 당신은 할 수 :
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; }
//...
}
+1 잘 쓰려고했습니다 –
감사합니다. 다른 대답을 살펴보면 마이크 시모어의 접근 방식이 훨씬 나아 졌다고 생각합니다. –
이것은 런타임에 기본값을 해석합니다. Mike의 접근법은 컴파일 타임에 해결됩니다. 또한 이것은 여기에 int 타입이 특별한 "default"플래그 값 (여기서는 -999)을 가질 수 있다고 가정하고 위험한 것입니다 : 어떤 식 으로든 -999가 실제 값으로 전달되면 예상대로 작동하지 않습니다. .. – galinette
불법 구문이므로 그렇게 할 수 있다고 생각하지 않습니다. 그러나 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
를 사용하여이 문제를 해결받을 수 있습니다 :)
코드를 다시 생각해보고 그런 식으로 변경해야하는 것처럼 들립니다.
호프가 도움이 되었으면 안녕하세요, 탐.
나는 따라하지 않는다. 만약 당신이 이와 같이하면, 사용되지 않기 때문에 매개 변수를 전달할 이유가 없다. –
@Michael Burr : 네, 맞습니다 ... 내 잘못입니다! Meh ... 나는 이것을 적절하게 편집하고 당신의 의견을 언급 할 것이다. 감사! :) – t0mm13b
첫 번째 아이디어는 다음과 같이 뭔가를 할 수 있습니다 :
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 가지 프로토 타입을 보여줍니다.
질문의이 부분에 답하기 위해 C에 기본 인수에 대한 개념이 없습니다 ** –