сте
NSString * __unused aString
иNSString __unused * aString
еквивалентни, когато те са променливи декларации?сте
- (void)aMethod:(NSString * __unused)aString
и- (void)aMethod:(NSString __unused *)aString
еквивалентни, когато те са декларации на параметрите на метода на целта С?Ако отговорът е "да", каква форма бих предпочела като правилна?
И в двата случая двете форми изглежда работят идентично при активиране / деактивиране 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 в списъка ви, има най-голямо смисъл за мен.