【问题标题】:Check if a variable name is being used in the current method检查当前方法中是否使用了变量名
【发布时间】:2014-03-30 02:28:40
【问题描述】:

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

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

【问题讨论】:

  • 你想完成什么?你更大的目标是什么?
  • @JoshCaswell 我刚刚澄清了。
  • 什么情况下不知道变量是否被声明了?

标签: objective-c variables macros c-preprocessor


【解决方案1】:

听起来您只需要一个新的内部范围,您可以从中声明不冲突的标识符。这就是为什么将标识符声明宏包装在单个 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 函数混淆了)结合上面的范围更改来制作小的动画工厂。

【讨论】:

    【解决方案2】:

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

    您无法在/* variableName is being used */ 中填写任何内容以获得您所描述的效果。

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 2020-04-07
      • 2010-09-22
      • 2016-10-06
      • 1970-01-01
      • 2021-04-21
      • 2014-02-17
      • 2015-05-01
      • 1970-01-01
      相关资源
      最近更新 更多