我想检查是否已定义变量名称。 我不在乎它是否等于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 :(得分: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函数从这对空白的外观中复杂化)与上面的范围变化结合起来制作小动画工厂。
答案 1 :(得分:1)
预处理器没有关于变量及其名称的信息。除了它自己有限的控制语法之外,它纯粹是用另一个文本替换一个文本,然后将然后传递给ObjC解析器。
您无法用/* variableName is being used */
填写任何内容以获得您所描述的效果。