Sind
NSString * __unused aString
undNSString __unused * aString
gleichwertig, wenn sie variable Deklarationen sind?Sind
- (void)aMethod:(NSString * __unused)aString
und- (void)aMethod:(NSString __unused *)aString
gleichwertig, wenn es sich um Objective-C-Methodenparameterdeklarationen handelt?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 № 1Es 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.