2014-03-30 115 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函数从这对空对子的外观)结合上面的范围更改来制作小动画工厂。

+0

非常感谢:) – aleclarson

1

预处理程序没有关于变量及其名称的信息。除了它自己有限的控制语法之外,它纯粹是用另一个文本替换一个文本,即,然后传递给ObjC解析器。

您无法填写/* variableName is being used */以获取您所描述的效果。

相关问题