2013-02-14 5 views
53

In objective-c verwende ich oft __typeof__(obj) bei Blöcken etc. Warum nicht __typeof(obj) oder typeof(obj).Unterschied zwischen typeof, __typeof und __typeof__ (Objective-c)

Wann verwenden welche?

+2

Ich weiß, dass jemand anderes eine ähnliche Frage gestellt hat, aber leider nicht alle drei. http://stackoverflow.com/questions/7618873/is-there-any-difference-with-type-of-and-typeof und war für C++ – hfossli

+1

Hmm. Ich habe immer Konstrukte wie '[obj isKindOf: otherObj]' benutzt. –

+1

Entschuldigung, ja. isKindOfClass ist etwas anderes. –

Antwort

47

__typeof__() und __typeof() sind compilerspezifische Erweiterungen der C-Sprache, da Standard C keinen solchen Operator enthält. Standard C erfordert Compiler, um Spracherweiterungen mit einem doppelten Unterstrich zu versehen (weshalb Sie dies auch für Ihre eigenen Funktionen, Variablen usw. nie tun sollten).

typeof() ist genau das gleiche, aber die Unterstriche werden aus dem Fenster geworfen mit dem Verständnis, dass jeder moderne Compiler es unterstützt. (Eigentlich, jetzt, da ich darüber nachdenke, Visual C++ vielleicht nicht. Es unterstützt jedoch decltype(), die im Allgemeinen das gleiche Verhalten wie typeof() bietet.)

Alle drei bedeuten die gleiche Sache, aber keine sind Standard C so ein Konform Der Compiler kann wählen, irgendeinen Unterschied zu machen.

+2

Der Satz "Wenn Sie eine Header-Datei schreiben, die funktionieren muss, wenn sie in ISO C-Programmen enthalten ist, schreiben Sie' __typeof__' anstelle von 'typeof'" auf der folgenden Seite scheint hier jedoch eine Art "Standard" zu beinhalten: http://gcc.gnu.org/onlinedocs/gcc/Typeof.html – trojanfoe

+1

Ja, in diesem nicht-Standard-Erweiterungen der Sprache sollte mit "__" vorangestellt werden, um sie als Nicht-Standard zu markieren. 'typeof()' ist technisch * schlecht * C, nicht nur * nicht standard * C. –

+2

OK nice one. Ich hatte nie einen Grund, diese Funktion in den über 20 Jahren C-Programmierung, die ich gemacht habe, zu verwenden. Ich werde jetzt nicht anfangen ;-) – trojanfoe

4

Hope this hilfreich sein wird:

-ansi und die verschiedenen -std Optionen deaktivieren bestimmte Schlüsselwörter. Dies führt zu Problemen, wenn Sie GNU C-Erweiterungen oder eine universelle Header-Datei verwenden möchten, die von allen Programmen, einschließlich ISO C-Programmen, verwendet werden kann. Die Schlüsselwörter asm, typeof und inline sind nicht in Programmen verfügbar, die mit -ansi oder -std kompiliert wurden (obwohl inline in einem Programm verwendet werden kann, das mit -std = c99 oder -std = c11 kompiliert wurde). Das ISO C99-Schlüsselwort restrict ist nur verfügbar, wenn -std = gnu99 (das eventuell die Standardeinstellung ist) oder -std = c99 (oder das äquivalente -std = iso9899: 1999) oder eine Option für eine spätere Standardversion verwendet wird.

Um diese Probleme zu lösen, setzen Sie '__' am Anfang und am Ende jedes problematischen Schlüsselworts. Verwenden Sie beispielsweise __asm__ anstelle von asm und __inline__ anstelle von inline.

http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords

+2

Das erklärt '__typeof__', aber was ist mit' __typeof'? –

25

Wie andere erwähnt haben, typeof() ist eine Erweiterung von C die verschiedene Unterstützung in jeweiligen Compilern hat.
Wenn Sie Objective-C für iOS- oder Mac-Apps schreiben, ist die Wahrscheinlichkeit groß, dass Sie Ihre App mit dem Compiler Clang kompilieren.

Clang unterstützt die Verwendung von typeof(), aber technisch ist es für, wenn Ihr C Language Dialekt eingestellt ist, ein gnu * Typ zu sein. Jedoch wird __typeof__() sowohl in c * als auch in gnu * Sprachdialekten unterstützt - wie im Clang documentation beschrieben. Jetzt

, wenn Sie Ihren Code mit Xcode zu schreiben, die Standardeinstellung für die Sprache C Dialekt erscheint GNU99 und die Möglichkeit, so dass ‚asm‘ ‚inline‘ ‚typeof‘ zu sein auf gesetzt Ja, so mit typeof() bringen Sie keine Probleme.

Xcode project settings

Wenn Sie sein möchten (wohl) sicherer, wenn die Clang-Compiler, __typeof__() verwenden. Auf diese Weise sind Sie nicht betroffen, wenn das für die Kompilierung verwendete C-Dialekt geändert wird oder wenn sich jemand dafür entscheidet, die Berechtigung 'typeof' zu deaktivieren.

+1

[C11 _Generic ist eine Alternative] (http://stackoverflow.com/a/25893397/895245) –

+0

Was ist mit __typeof? –

Verwandte Themen