2015-01-30 16 views
5

In Objective-C haben wir verschiedene Schlüsselwörter, um boolesche Werte auszuwerten. Wir haben YES/NO, TRUE/FALSE und (c99) true/false. Ich verstehe BOOL vs bool gut genug und in diesem Artikel erläutert die Unterschiede wunderbar:Objective-C WAHR/FALSCH vs wahr/falsch

http://www.bignerdranch.com/blog/bools-sharp-corners/

Also, was YES/NO bedeutet nicht meine Frage. Meine Frage ist, was ist der Unterschied zwischen TRUE/FALSE und true/false? Ist die Großbuchstabe Version ein Alias ​​für YES/NO oder ein Alias ​​für (c99) true/false? Oder ist es ein anderes Tier überhaupt (wie YES/NO)?

Antwort

15

Die Bezeichner YES und NO werden als Objective-C-Standardliterale für BOOL betrachtet. Normalerweise finden Sie YES, NO oder BOOL außerhalb des Objective-C-Quellcodes nicht. Beachten Sie, dass diese Bezeichner tatsächlich Makros sind, die in objc/objc.h definiert sind.

Die true und false Kennungen sind Standard C99 (wie Sie notiert), wenn Sie #include <stdbool.h>. Beachten Sie, dass Sie, da Sie Objective-C verwenden, indirekt stdbool.h einschließen, auch wenn Sie es nicht kennen. Zum Beispiel enthält Foundation.hCoreFoundation.h, was stdbool.h einschließt. Daher ist es ziemlich schwierig, eine moderne iOS- oder Mac-App zu kompilieren, ohne true und false zu bekommen.

Die Kennungen TRUE und FALSE sind nicht Standard. Sie sind historisches Gepäck, das von verschiedenen Bibliotheken definiert wird. Die Bibliotheken wurden möglicherweise vor dem Aufkommen von C99 geschrieben oder nachher geschrieben, waren aber dazu gedacht, Vor-C99-Compiler zu unterstützen, oder sie wurden einfach von Autoren geschrieben, die die booleschen Booleschen Literale C99 nicht kennen. Auf dem Mac sind einige Beispiele für solche Bibliotheken Kerberos, XDR/RPC und Ncurses. Am wichtigsten ist, dass die Mach-Kernel-Header TRUE und FALSE Konstanten definieren und (wie bei stdbool.h) es ziemlich schwierig ist, diese speziellen Definitionen zu vermeiden, wenn Sie eine moderne iOS- oder Mac-App erstellen.

In allen Fällen, die ich finden konnte, TRUE ist definiert als 1 oder (1) und FALSE als 0 oder (0) definiert.

(Alle Bibliotheken bereits erwähnt, und der Mach-Kernel, predate C99 und sind somit gerechtfertigt ihre eigenen boolean Konstanten zu definieren.)

+1

Von all meinen Googling und Stack-Artikeln mit ähnlichem Thema ist dies bei weitem die prägnanteste und anspruchsvollste Antwort, die man sich wünschen kann. –

1

Im Hinblick auf ncurses, die WAHR/FALSCH/Bool Nutzung früher c99 und ist in XPG4-Curses von 1996 dokumentiert. Das Skript configure von ncurses prüft die vorhandenen C++ - und c99-Werte und verwendet sie, wenn sie verfügbar sind. Siehe zum Beispiel das ncurses-Änderungsprotokoll, beginnend in early 1997

Verwandte Themen