2012-04-08 5 views
0

내 문자열을 자르기위한 매크로를 만들고 싶습니다.매크로 예상 식 문제 정의

[[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]] 

하지만 오류가 아래로 난 매크로를 작성하는 경우 :

나는 트리밍 아래이 코드를 사용 표현

#define TRIM_STRING(string) ([[NSString stringWithString:string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]) 

어떻게 올바르게 만들 같은 매크로 정의 예상 한?

답변

3

:

#define TRIM_STRING(string) [(string) stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] 

그러나, 정말 여기에 인라인 함수를 사용하지 않을 이유가 없습니다. 형식 검사를 받으면 컴파일러에서 오류 메시지를 표시합니다.

NSString * NSStringTrim(NSString *string) 
{ 
    return [string stringByTrimmingCharactersInSet: 
      [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

또는 더 나은이를 위해있는 NSString에 대한 범주를 만들 :

@interface NSString (additions) 

- (NSString *)stringByTrimmingWhitespace; 

@end 

@implementation NSString (additions) 

- (NSString *)stringByTrimmingWhitespace 
{ 
    return [self stringByTrimmingCharactersInSet: 
      [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
} 

@end 

당신이 네임 스페이스 지정을 얻을이 방법, 당신은

을 수행하여 호출 할 수 있습니다 인라인 함수와 동일
[string stringByTrimmingWhitespace] 

코코아와 더 깔끔하고 일관성이 있습니다.

2

시작 및 끝 괄호를 제거하십시오. 당신은 너무 많은 한 쌍을했습니다.

그런 다음 "NSString stringWithString:string"을 제거하고 string으로 바꿉니다. 이것은 괄호 안에 넣지 않았기 때문에 그 자체가 잘못되었지만 학문적이었습니다. 당신은 어쨌든 문자열의 복사본을 만들 필요가 없습니다.

편집 :

매크로로 인수가 괄호에이 매크로에서 발생 때마다 괄호에 배치하기로 그것은 좋은 생각이다. 이렇게하면 선행 처리기가 매크로를 확장 할 때 문제 (복잡한 표현식을 인수로 지정하는 경우)를 피할 수 있습니다. 매크로로