检查当前方法中是否使用了变量名称

时间:2014-03-30 02:28:41

标签: objective-c variables macros c-preprocessor

我想检查是否已定义变量名称。 我不在乎它是否等于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];

注意:带有宏的部分只是我对这个问题的用例。你的答案应该在方法中起作用。

2 个答案:

答案 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 */填写任何内容以获得您所描述的效果。