2016-11-30 1 views
2

(Bitte diesen Beitrag bearbeiten, wenn ich falsch C++ Begriffen. Ich bin insgesamt C++ Noob.)NULL-Zulässigkeit Regeln für C++ Objekte in Objective-C++

Wie funktioniert Objective-C nullability Arbeit mit C++ Objekten in einem Objective-C++ Klasse ?

Zum Beispiel die folgende Art und Funktion gegeben:

typedef struct 
{ 
    const Foo* fooArray; 
    uint32_t fooArrayLength; 

} FooList; 

uint32_t GetFoo(const std::string& bar, std::shared_ptr<const FooList>& result); 

Ist es legal GetFoo thusly neu zu definieren?

uint32_t GetFoo(const std::string& _Nonnull bar, std::shared_ptr<const FooList _Nullable>& _Nonnull result); 

Bekomme ich irgendwelche Warnungen entweder Klappern oder dem statischen Analysator, wenn ich GetFoo thusly nennen?

GetFoo(nil, nil); 

Antwort

1

Sie haben die beiden C++ - Fälle ausgewählt, bei denen Nullheit keinen Sinn ergibt. :-)

  1. Ihre const FooList ist ein Nicht-Zeiger-Typ, so kann niemals nullptr (oder NULL auf älteren C++ Compiler) sein.

  2. Referenzen sind durch den Standard definiert als nie nullptr entweder. Das macht Sinn, denn nullptr ist ein Zeigertyp, und die einzige Möglichkeit, von einem nullptr zu einem Verweis zu gehen, ist das Dereferenzieren, was ... na ja, niemand weiß, was passiert, wenn Sie einen Nullzeiger dereferenzieren.

jedoch der einzige Fall, in dem Sie nicht nullability (die const Foo* in der Struktur) angegeben haben, ist eigentlich, wo es gültig wäre.

Zumindest, wenn Sie auf Apples Compiler laufen. Technisch gesehen ist Apples Nulltabilität nur ein Teil der Objective-C (und der Erweiterung Objective-C++) Standards, also eine nicht-standardisierte Erweiterung von C++, die vom Compiler abhängt (daher der Unterstrich an seinem Anfang, der für compilerspezifische Schlüsselwörter reserviert ist)).

NB - Aus Performance-Gründen, die meisten C++ Compiler nur Referenzen als syntaktischer Zucker oben auf Zeigern, implementieren, so in der Praxis Sie etwas Böses wie

Foo* myFoo = nullptr; 
Foo& myFooRef = *myFoo; 

und sie würden Sie nicht tun konnte, wissen gerade eine nullptr Referenz gemacht, aber das fällt unter "undefiniert" Verhalten und als solche ist falscher Code. Allerdings weiß ich nicht, ob ein Objective-C++ - Compiler derzeit die Nullwertfähigkeit von C++ - Referenzen analysiert. Ein schneller Test zeigt Apple's zumindest nicht. Nicht sicher, ob der statische Analysator es auch fängt.

PS - Wenn Sie den obigen Code zu kompilieren versucht, sollten Sie einen Fehler über den Gebrauch von _Nullable (sic) auf einem Nicht-Zeiger-Typ erhalten.

+0

Vielen Dank! Ich nehme an, Sie haben herausgefunden, dass ich C++ nicht wirklich kann. :) –

1

Jordan Rose (des Swift-Team bei Apple) says:

Referenzen sind keine Zeiger, so dass sie nicht bekommen, nullability. Refs können jedoch nach dem C++ - Standard niemals NULL sein.

Also die Frage ist strittig.

jedoch regarding pointers.

[Regelmäßige Zeiger noch nullability in C erhalten ++ und Objective-C++] (Aber es gibt viele Ecken und Kanten um Vorlagen, leider ObjC++ NULL-Zulässigkeit hat eine Priorität gewesen.)