2010-03-12 5 views
28

가능한 중복 : 나는이 목표 C에서 C 함수를 쓰고 있어요
Optional arguments in Objective-C 2.0?
Objective-C Default Argument Value목표 C 기본 매개 변수?

내 마지막 매개 변수에 대한 기본 값을합니다.

foo(int a, int b, int c = 0); 

하지만 나는 또한

foo(int a, int b, int c) 
{ 
... 
} 

foo(int a, int b) 
{ 
    foo(a, b, 0); 
} 

을 시도했다하지만 그건 ++ ALSO C의 C++

입니다 :

은 내가 시도했습니다.

Objective C에서이 작업을 수행하는 방법은 무엇입니까?

+1

중복 된 http://stackoverflow.com/questions/871796/objective-c-default-argument-value 및/또는 http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c -2-0, 나는 믿는다. –

+0

첫 번째 방법은 모든 사람이 메서드 호출에 응답했거나 두 가지 foo 함수를 가질 수 있다는 잘못된 문구 때문에 도움이되지 않았습니다. 두 번째는 모든 메서드 호출입니다 ... –

답변

89

ObjC에는 기본 매개 변수가 없습니다.

당신은하지만이 방법을 만들 수 있습니다 C를 들어

-(void)fooWithA:(int)a b:(int)b c:(int)c { 
    ... 
} 
-(void)fooWithA:(int)a b:(int)b { 
    [self fooWithA:a b:b c:0]; 
} 

: ObjC를 사용하여 C의 부분 집합에 추가 특별한 아무것도 없다. 순수 C로 수행 할 수없는 것은 ObjC에서 컴파일하는 것으로도 수행 할 수 없습니다. 즉, 기본 매개 변수를 가질 수 없으며 함수에 과부하가 걸리지 않습니다. 대신에 2 개의 함수를 생성하십시오.

+5

+1 올바른 방법입니다. :) 실제로 C 함수가 필요한 경우와 같습니다 : 다른 이름을 사용하십시오. – Macmade

+0

@macmade yeah '그게 내가 현재하고있는 일이야. C++ 기본 스타일이 코드를 조금 더 깨끗하게 만든다고 생각해. –

+0

@Kenny, 네,하지만 이것은 어떤 클래스에도 속하지 않습니다. 그것은 정말로 독립형 C 함수입니다 ... –

1

C 함수의 경우 - 아니요. Objective C 클래스 메쏘드의 경우 - 네, 단지 두 개의 메쏘드를 사용합니다, 하나는 하나의 매개 변수를 짧게하고, 다른 메쏘드는 호출합니다.

소스 이름을 .mm으로 바꿀 수 있고 C 함수가 마술처럼 C++가 될 수 있습니다.

+0

그건 재미있는 가능성이야 ... 난 ' 내 통합의 다른 부분에서 그 비용을 알아 내야 할 것입니다 ... –

+0

이것은 글로벌 이름 장식을 변경합니다. .m/.c 소스에서 외부로 이러한 함수를 호출 할 수 없습니다. 함수를 "extern C++"로 선언하는 방법이 있다면, 익숙하지 않습니다. 다른 말로하면, ObjC++로 간다면 프로젝트 전체에서 이렇게하는 것이 좋습니다. –

1

당신은 가변 길이 인수 목록과 C 함수를 작성 할 수 있습니다. 함수의 선언 된 매개 변수 중 하나의 데이터 형식으로 '...'을 사용하여 매개 변수 목록에서 가변 인수 목록이 시작되는 위치를 지정할 수 있습니다. (목록 시작 전에 하나 이상의 필수 인수를 가질 수 있습니다.)

printf()는이 기능 (varargs)을 사용하여 작성된 함수의 예입니다.

printf(const char *restrict format, ...); 

여기에서 첫 번째 인수는 필수이며 0 개 이상의 추가 인수가 올 수 있습니다.

이 방법으로 함수를 작성한 경우 누락 된 매개 변수의 기본값을 제공 할 수 있습니다.