2010-05-19 5 views
4

매크로가없는 곳 (Java/Python/C#/Scala)에서 발생하므로 내 관점이 왜곡되어 있지만 ...Objective-C/Cocoa에서 매크로가 필요한 이유는 무엇입니까?

매크로가 Cocoa에서 사용되는 이유는 무엇입니까? 마음에 봄 2는 NSLocalizedStringNSAssert (및 STAssert)입니다. 그것들을 (인라인 될 수있는) 함수로 만드는 것은 너무 어렵거나 부적합한가요? 나는 C에 불필요한 던전으로 약간 이상하다고 생각한다. (그렇다. Obj-C의 혈통에 익숙하다.)

하루에 다시 완료되었거나 특별한 이유가 있습니까?

+3

매크로에 어떤 문제가 있습니까? 매크로는 새로운 'goto' 악마입니까? – mouviciel

+0

'goto'는 악마입니다 ... –

+2

아닙니다 .-''goto'는 적절한 방식으로 적용될 때 악의가 아닙니다. 어떤 경우에는 다른 것들을 사용하는 것보다 훨씬 더 깔끔한 코드가됩니다. (예를 들어, while, if, for 등을 여러 번 사용하지 않는 경우) 코드가 더 많은 메소드에서 분리되어 사용 되곤 합니다만, goto는 확실히 – Ahti

답변

8

일반적으로 매크로는 사용하지 않는 것이 좋지만, NSAssert()과 같은 기능의 경우에는 사용할 수 없습니다. 당신이 정의를 보면

, 당신은 __LINE__, __FILE__, _cmd 그것은에서 사용되는 맥락에서 self를 사용하고 있음을 알 수 있습니다.이 매크로 아니었다 경우, 해당 정보에 액세스 할 수없는 것 .

그러나 NSLocalizedString에 대해서는 분명히 이유가 없습니다.

+1

매우 좋은 점 – Joe

+0

모호성의 경우에'NSLocalizedString'도'__LINE__' 또는'__FILE__'에 액세스해야한다고 생각합니다 – Debilski

+0

코코아 버전은'[[ NSBundle mainBundle]', 그래서 나는 그것을 볼 수 없다. @Deb –

4

NSLocalizedString은 편리한 매크로이며 아마도 함수로 만들 수 있습니다.

그러나 Georgian의 답변에 제공된 매크로 외에 NSAssert와 친구들이 매크로 인 이유가 있습니다. NSAssert는 부울 식을 평가하여 예외를 던져야하는지 여부를 결정합니다. 그 부울 표현식은 계산 비용이 많이 들고 릴리스 코드에서 원하는 일이 아닙니다. 정상적인 기능을 생략하는 릴리스 빌드 요구의 C (따라서 목표 - C)의 메커니즘은 전처리에 의지 혹은 같은 물건을 사용하지 않고 없습니다 :

if (debug) 
{ 
    assertAsAFunction(foo == 3, "foo should be 3"); 
} 

NSAssert 매크로의 또 다른 장점은 그 조건이 할 수있다 로그 메시지에 사용할 수 있도록 문자열로 묶어야합니다.

관련 문제