2014-01-16 2 views
3
  1. Есть NSString * __unused aString и NSString __unused * aString эквивалент, когда они являются переменными объявлениями?Являются ли «NSString * __unused aString» и «NSString __unused * aString» эквивалентом?

  2. Есть - (void)aMethod:(NSString * __unused)aString и - (void)aMethod:(NSString __unused *)aString эквивалент, если они являются объявлением параметра метода Objective-C?

  3. Если ответ «да», какую форму я должен предпочесть как правильную?

Обе формы в обоих случаях, кажется, работают одинаково, когда включение/отключение GCC_WARN_UNUSED_PARAMETER и GCC_WARN_UNUSED_VARIABLE директивы.

Я не нашёл никакой информации для разъяснения этой проблемы.


Соответствующие темы:

__unused Flag Behavior/Usage (GCC with Objective C)

ответ

6

Существует разница между ними.

Когда атрибут __unused появляется перед звездой, он украшает основной тип всего списка объявлений. Все переменные будут «неиспользуемый»:

__unused NSString *foo, *bar; // OK. All variables are unused in the statement. NSString __unused *foo, *bar; // OK

Но когда ставится после *, она будет применяться только к первой переменной:

NSString * __unused foo, *bar; // Unused variable 'bar'

Я предпочитаю NSString * __unused foo;, потому что кажется более ясным для меня и не будет скрывать редкий случай, когда я объявляю несколько переменных в одном выражении.

GCC Attribute Syntax ссылка упоминает о нем в разделе 6.31:

список атрибутов спецификатор может появиться непосредственно перед описателя (кроме первого) в разделенных запятыми список declarators в декларации более чем один идентификатор, используя один список спецификаторов и определителей . Такие спецификаторы атрибутов применяются только к идентификатору до того, чей декларатор они появляются.Например, в

__attribute__((noreturn)) void d0 (void), 
    __attribute__((format(printf, 1, 2))) d1 (const char *, ...), 
     d2 (void) 

атрибут noreturn применяется ко всем объявленным функциям; атрибут формата применяется только к d1.

1

Там еще третий вариант, который ведет себя так же: __unused NSString *. Это кажется более распространенным на Github.

Для объявлений методы есть другой стиль похож на второй вариант в списке:

- (void)aMethod:(NSString *) __unused aString 

Я читал справа налево. Просматривая ваш список, я прочитал NSString * __unused как «неиспользуемый указатель на экземпляр NSString», и я прочитал NSString __unused * как «указатель на неиспользуемый экземпляр NSString». Первый, т. Е. № 1 в вашем списке, имеет для меня наибольший смысл.

+0

Спасибо за ответ. Пожалуйста, см. [This] (https://github.com/AFNetworking/AFNetworking/issues/624) о том, что в круглых скобках нет __unused. Именно по этой причине я исключил это из списка вариантов в моем вопросе. –

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