Xcode: макросы, нарушающие завершение / выделение - PullRequest
4 голосов
/ 29 октября 2011

Из документов Xcode :

Подсветка синтаксиса, завершение кода и все остальные индексы эта функция обрабатывается парсером LLVM. Если компилятор знает о символ, как и Xcode IDE.

но ни одна из этих «управляемых индексом функций» не работает для меня при написании кода внутри директивы препроцессора. У кого-нибудь есть решение для этого?

Примеры:

При сборке с включенными Неиспользованный параметр предупреждений, тонны предупреждений генерируются, даже когда указанный параметр используется . Код на этом конкретном скриншоте взят из Apple Reachability.m и не изменен. Обратите внимание, что подсветка синтаксиса здесь также отсутствует:

Warnings

Правильно завершение внутри #if:

Correct Code Completion

Но, неверно завершение внутри #else:

Incorrect Code Completion

Половина работает с локальными переменными:

Broken Parsing in UIDeviceOrientationIsPortrait Macro

Но снова прерывается при вызове чего-либо, объявленного вне текущей области действия метода:

Broken Parsing in UIDeviceOrientationIsPortrait Macro

Другой пример
Другой пример

Может кто-нибудь сказать, как (или даже , если ) это можно исправить?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2015

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

enter image description here

enter image description here

Подсветка синтаксиса, автозаполнение и предупреждения (в данном случае предупреждение о непеременной переменной) не работают в неверном состоянии.

Я открыл вопрос о том, как заставить XCode выполнять все эти действия с обеих сторон условия, но пока не повезло.
Подсветка синтаксиса XCode в обоих условиях препроцессора #if #else

Для записи я не думаю, что это поведение является ошибкой.Я могу представить себе случаи, когда было бы крайне неприятно получать ошибки в коде, который не будет компилироваться.Однако было бы неплохо иметь возможность редактировать обе стороны этих условий без необходимости манипулирования определениями макросов.

1 голос
/ 10 ноября 2011

@ chown, я думаю: "Если компилятор знает о символе ... точно так же, как при сборке".указать, что компилятор анализирует код и выполняет все условия препроцессора.В таком случае компилятор не будет замечать использование переменных внутри таких #ifdef, где условие не выполнено.

Это также объясняет, почему оно «работает нормально в #else.».

Вы можете попробовать использовать макрос UNUSED, но вам придется отключить предупреждение для «Неиспользуемые значения»:

#define UNUSED(a) a
...
-(void)test:(id)argument
{
    UNUSED(argument);
#ifdef AAA
    NSLog(@"arg:%@", argument);
#endif    
}
0 голосов
/ 29 марта 2012

Оказывается, это была ошибка, и теперь она исправлена ​​в версии Xcode 4.3.1 (4E1019).

...