1

谁能告诉我为什么跟随警告我“未使用的变量变量str”?SetAccessibilityLabelForView 是一个宏。

NSString *str = [NSString stringWithFormat:dynString, index];
SetAccessibilityLabelForView(myView, str);

dynamicString 在单例类中设置,例如"dynamic%d".

宏:

#if RUN_TESTS
#define SetAccessibilityLabelForView(view, label) view.accessibilityLabel = label
#else
#define SetAccessibilityLabelForView(view, label)
#endif

当 RUN_TESTS 为真或假时,两种情况都会出现警告,但如果我删除了 else 部分,那么警告就会消失!

我曾尝试使用以下来摆脱警告,

  SetAccessibilityLabelForView(myView, [NSString stringWithFormat:dynString, index])

这给了我错误:“为类似函数的宏调用提供了太多参数”!

然后我将宏更改为以下,

#if RUN_TESTS
#define SetAccessibilityLabelForView(view, label, ...) view.accessibilityLabel = label
#else
#define SetAccessibilityLabelForView(view, label, ...)
#endif

现在,当 RUN_TESTS 为 FALSE 时,同一行有效,但在 RUN_TESTS 为 TRUE 时给出错误“Expected ']'”!呸!!

有人可以在这里帮助我吗?我想让宏对这两种情况都有效,但只想在 RUN_TESTS 为 FALSE 时忽略宏生成的行。

4

2 回答 2

0

第一个出错了,因为如果没有定义 RUN_TESTS,那么代码:

NSString *str = [NSString stringWithFormat:dynString, index];
SetAccessibilityLabelForView(myView, str);

扩展为:

NSString *str = [NSString stringWithFormat: dynString, index];
-blank-

尝试这样做(使用宏的第一个版本):

SetAccessibilityLabelForView(myView, [NSString stringWithFormat: dynString, index]);

如果定义了 RUN_TESTS,则会扩展到此:

myView.accessibilityLabel = [NSString stringWithFormat: dynString, index];

或者如果不是就完全编译出来(所以在这两种情况下都应该构建得很好)。

于 2013-05-30T16:08:00.287 回答
0

我无法解决这个问题!我最终忽略了如下未使用的变量警告。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"

NSString *str = [NSString stringWithFormat:dynString, index];
SetAccessibilityLabelForView(myView, str);

#pragma clang diagnostic pop

[编辑]

最后我提出了更好的解决方案,编写另一个宏来支持格式化字符串..

#if RUN_TESTS
#define SetAccessibilityFormatedLabelForView(view, labelFormat, ...) view.accessibilityLabel = [NSString stringWithFormat:labelFormat, __VA_ARGS__]
#else
#define SetAccessibilityFormatedLabelForView(view, labelFormat, ...)
#endif

用法:

SetAccessibilityFormatedLabelForView(myView, dynString, index);
于 2013-05-31T08:08:22.480 回答