2014-03-30 6 views
1

변수 이름이 이미 정의되어 있는지 확인하고 싶습니다. nil과 같은지는 상관하지 않습니다. 아직 정의되지 않은 변수를 정의하는 매크로에서이 변수를 사용합니다. 그러나 그것이 정의된다면, 매크로는 변수를 재정의하기보다는 변수를 설정하게됩니다 (실제로 컴파일러가 빌드를 방해합니다).변수 이름이 현재 방법에서 사용되고 있는지 확인하십시오.

#define newAnimation()\ 
if (/* variableName is being used */) {\ 
    anim = [CABasicAnimation animation];\ 
} else {\ 
    CABasicAnimation* anim = [CABasicAnimation animation];\ 
} 

그런 매크로를 사용합니다.

newAnimation(); 
anim.keyPath = @"position.x"; 
anim.toValue = @10; 
[self.namedSubview addAnimation:anim forKey:nil]; 

newAnimation(); 
anim.keyPath = @"position.y"; 
anim.toValue = @50; 
[self.otherSubview addAnimation:anim forKey:nil]; 

참고 : 매크로가있는 부분은이 질문에 대한 내 사용 사례입니다. 대답은 방법 내에서 작동해야합니다.

+0

달성하려는 목표는 무엇입니까? 당신의 더 큰 목표는 무엇입니까? –

+0

@ JoshCaswell 방금 설명했습니다. – aleclarson

+0

어떤 상황에서 변수가 선언되었는지 알 수 없습니까? –

답변

2

충돌하지 않는 식별자를 선언 할 수있는 새로운 내부 범위가 필요한 것처럼 들립니다. 따라서 식별자 선언 매크로를 단일 do-while 블록 또는 단순히 블록으로 묶는 것이 항상 좋은 이유입니다. 예를 들어, 코드 블록을 수용하고 여전히 서로 충돌에서 연속 호출을 유지하기 위해 매크로를 변경할 수 있습니다 : 그 너머

#define CFICreateAnimationInScope(BLOCK) { \ 
CABasicAnimation* anim = [CABasicAnimation animation]; \ 
BLOCK \ 
} \ 

void f() { 
    CFICreateAnimationInScope({ 
     anim.keyPath = @"position.x"; 
     anim.toValue = @10; 
    }); 

    CFICreateAnimationInScope({ 
     anim.keyPath = @"position.y"; 
     anim.toValue = @50; 
    }); 
} 

,이 사실은 함수와 같은 매크로를 사용하고 (당신은 혼란 매크로 것으로 보인다 및 C 펑크 (empty parens) 쌍의 외형으로부터의 C 함수)를 위의 범위 지정 변경과 결합하여 작은 애니메이션 팩토리를 만듭니다.

+0

대단히 감사합니다 :) – aleclarson

1

전 처리기에는 변수 및 해당 이름에 대한 정보가 없습니다. 자신의 제한된 제어 구문 외에도, 그것은 한 비트의 텍스트를 다른 텍스트로 완전히 대체 한 것입니다. ,이 ObjC 파서로 전달되었습니다.

설명하는 효과를 얻기 위해 /* variableName is being used */을 채울 수 없습니다.

관련 문제