2013-05-30 7 views
1

Может кто-нибудь скажет мне, почему следующее Предупреждает меня «неиспользуемая переменная переменная str»? SetAccessibilityLabelForView - это MACRO.iOS: проблемы с использованием переменных внутри MACRO

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

dynamicString является установкой в ​​одноплодном классе как "dynamic%d".

Macro:

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

ВНИМАНИЕ приходит для обоих случаев, когда RUN_TESTS истинным или ложным, но если я удалил еще часть, то предупреждение уходит!

Я попытался с помощью следующих действий, чтобы избавиться от предупреждения,

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 ИСТИНА !! Уф !!

Может кто-то, пожалуйста, помогите мне здесь. Я хочу, чтобы макрос работал для обоих случаев, но просто хочу игнорировать строки, созданные макросом, когда RUN_TESTS FALSE.

+0

Сообщения макроса кода пожалуйста – Stavash

+0

Я был бы удивлен, если предупреждение из-за макроса, но в любом случае я редактировал вопрос. – applefreak

+0

Я удивлен :) Я думаю, что это происходит потому, что в другом варианте я не использую «ярлык»! Могу ли я обойти это? – applefreak

ответ

0

Я не мог решить эту проблему! В конце концов я проигнорировал предупреждение о непродуманной переменной, как показано ниже.

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

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

#pragma clang diagnostic pop 

[EDIT]

Наконец я вышел с лучшим решением сочинительства другого макроса для поддержки отформатированной строки ..

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

Использование:

SetAccessibilityFormatedLabelForView(myView, dynString, index); 
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]; 

или просто полностью скомпилирован, если это не так (поэтому в обоих случаях должен строиться штраф).

+0

Вы правы, но я хочу, чтобы он работал для обоих случаев, когда определен RUN_TESTS или нет. См. Обновленный вопрос. Благодарю. – applefreak

+0

Это должно работать даже с определенным. Дело в том, что у вас есть переменная, которая не используется, но на нее ссылаются в состоянии non-running-tests. Все, что вам нужно сделать, это переместить это в фактический макрос. –

+0

Я сделал это, но это дает мне ERROR: «Слишком много аргументов, предоставляемых функционально-подобному вызову макросов»! для первой версии .. – applefreak

 Смежные вопросы

  • Нет связанных вопросов^_^