Подтвердить что ты не робот

Использование атрибута GCC __unused с Objective-C

Можно ли использовать макрос атрибута __unused в параметрах метода объекта Objective-C? Я попытался разместить его в разных позициях вокруг объявления параметра, но он либо вызывает ошибку компиляции, либо, кажется, игнорируется (т.е. Компилятор все еще генерирует предупреждения неиспользуемых параметров при компиляции с -Wall -Wextra).

Кто-нибудь мог это использовать? Это просто не поддерживается с помощью Objective-C? Для справки, я в настоящее время использую сборку Apple из GCC 4.0.1.

4b9b3361

Ответ 1

Хорошо, я нашел ответ... похоже, это ошибка с реализацией Apple gcc 4.0. Использование gcc 4.2 работает так, как ожидалось, и правильное размещение выглядит следующим образом:

-(void)someMethod:(id) __unused someParam;

Он задокументирован в примечаниях к выпуску Objective-C, если кому-то интересно: http://developer.apple.com/releasenotes/Cocoa/RN-ObjectiveC/index.html#//apple_ref/doc/uid/TP40004309-DontLinkElementID_6

В качестве примечания, ваш ответ будет компилироваться, Луис, но, как я заявил в своем вопросе, он фактически ничего не сделает или не подавит неиспользованное предупреждение, выпущенное компилятором.

EDIT: я подал отчет об ошибке с яблоком для этого rdar://6366051.

Ответ 2

Я думаю, вы можете использовать #pragma unused для обозначения аргументов как неиспользуемых. Непроверенный, но вы можете попробовать что-то вроде

- (NSString *)test:(NSString *)test {
#pragma unused (test);
  return nil;
}

Ответ 3

Общей идиомой является использование следующего:

#define UNUSED(x) (void)x
void SomeFunction(int param1, int param2)
{
  UNUSED(param2);
  // do stuff with param1
}

Оператор UNUSED(param2) не генерирует никакого объектного кода, исключает предупреждения о неиспользуемых переменных и явно документирует код как не использующий переменную.

Ответ 4

Я могу скомпилировать следующее просто отлично:

- (NSString *) test:(__unused NSString *)test {
    return nil;
}

Изменить: На самом деле это может быть не просто арка:

Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror
Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror  -Wunused-parameter
cc1obj: warnings being treated as errors
Pusher.m:40: warning: unused parameter ‘test’
Phoenix-VI:CouchPusher louis$ 

So -Wall не включает в себя не включать параметр -Wunused....

Ответ 5

После боя С#pragma какое-то время я обнаружил его

+ (NSString*) runQuery:(id)query name:(NSString*)name options:(NSDictionary*)options
{
#pragma unused(name)
 ...

}