/ / Sind "NSString * __unused aString" und "NSString __unused * aString" gleichwertig? - Ziel-c, Klang

Sind "NSString * __unused aString" und "NSString __unused * aString" gleichwertig? - Ziel-c, Klang

  1. Sind NSString * __unused aString und NSString __unused * aString gleichwertig, wenn sie variable Deklarationen sind?

  2. Sind - (void)aMethod:(NSString * __unused)aString und - (void)aMethod:(NSString __unused *)aString gleichwertig, wenn es sich um Objective-C-Methodenparameterdeklarationen handelt?

  3. Wenn die Antwort "Ja" ist, welche Form sollte ich als korrekt vorziehen?

Beide Formulare scheinen in beiden Fällen beim Aktivieren / Deaktivieren identisch zu funktionieren GCC_WARN_UNUSED_PARAMETER und GCC_WARN_UNUSED_VARIABLE Richtlinien.

Ich habe keine Informationen gefunden, um dies zu klären.


Relevante Themen:

__unused Flag Behavior / Usage (GCC mit Ziel C)

Antworten:

6 für die Antwort № 1

Es gibt einen Unterschied zwischen den beiden.

Wenn das Attribut __unused, erscheint vor dem Stern, es schmückt den primären Typ der gesamten Deklarationsliste. Alle Variablen sind "unbenutzt":

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

Aber wenn nach dem *Es gilt nur für die erste Variable:

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

ich bevorzuge NSString * __unused foo; weil es mir klarer erscheint und ich den seltenen Fall nicht verstecke, wenn ich mehrere Variablen in einer Aussage deklariere.

Das GCC-Attributsyntax Referenz erwähnt es in Abschnitt 6.31:

Eine Attributbezeichnerliste wird möglicherweise angezeigtunmittelbar vor einem Deklarator (außer dem ersten) in einer kommagetrennten Liste von Deklaratoren in a Deklaration von mehr als einer Kennung unter Verwendung einer einzigen Liste von Spezifizierer und Qualifier. Solche Attributbezeichner gelten nur für die Kennung, vor deren Deklarator sie erscheinen. Zum Beispiel, in

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

Das noreturn-Attribut gilt für alle deklarierten Funktionen. Das Format-Attribut gilt nur für d1.


1 für die Antwort № 2

Es gibt eine dritte Option, die sich ähnlich verhält: __unused NSString *. Dies scheint häufiger auf Github wenigstens.

Für Methodendeklarationen gibt es einen anderen Stil, der der zweiten Option in Ihrer Liste ähnelt:

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

Ich lese von rechts nach links. Ich habe deine Liste durchgelesen NSString * __unused als "ungenutzter Zeiger auf eine NSString-Instanz" und ich las NSString __unused * als "Zeiger auf eine nicht verwendete NSString-Instanz". Ersteres, d. H. # 1 in Ihrer Liste, macht für mich am meisten Sinn.