/ / Са еквивалентни "NSString * __unused aString" и "NSString __unused * aString"? - цел-c, клонг

Използват ли "NSString * __unused aString" и "NSString __unused * aString"? - цел-c, клонг

  1. сте NSString * __unused aString и NSString __unused * aString еквивалентни, когато те са променливи декларации?

  2. сте - (void)aMethod:(NSString * __unused)aString и - (void)aMethod:(NSString __unused *)aString еквивалентни, когато те са декларации на параметрите на метода на целта С?

  3. Ако отговорът е "да", каква форма бих предпочела като правилна?

И в двата случая двете форми изглежда работят идентично при активиране / деактивиране GCC_WARN_UNUSED_PARAMETER и GCC_WARN_UNUSED_VARIABLE директиви.

Не намерих никаква информация, за да изясня това.


Съответни теми:

__unused Behavior / Usage Flag (GCC с цел C)

Отговори:

6 за отговор № 1

Има разлика между двете.

Когато атрибутът, __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; защото ми се струва по-ясна и няма да скрия случая, когато декларирам няколко променливи в едно изявление.

Най- Синтаксис на ССС атрибута позоваването се споменава в раздел 6.31:

Може да се покаже списък с указатели на атрибутинепосредствено пред декларатора (различна от първата) в списък с декларатори, разделени със запетая в a - деклариране на повече от един идентификатор, като се използва единствен списък с спецификации и квалификации. Такива спецификатори на атрибути се прилагат само за идентификатор, пред чийто декларатор се появяват. Например, в

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

атрибутът noreturn се прилага за всички декларирани функции; атрибутът формат се прилага само за d1.


1 за отговор № 2

Има и трета опция, която се държи по подобен начин: __unused NSString *, Това изглежда по-често срещано Github поне.

За декларациите на методи има друг стил, подобен на втория вариант във вашия списък:

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

Четох от дясно на ляво. Преглеждайки списъка си, прочетох NSString * __unused като "неизползван показалец към инстанция на NSString" и прочетох NSString __unused * като "показалец към неизползван потребителски интерфейс на NSString". Първият, т.е. # 1 в списъка ви, има най-голямо смисъл за мен.