Nach dem, was ich dort gelesen habe: Warum ist Objective-C außerhalb der Apple-Community nicht sehr beliebt?
Objective-C ist eine Obermenge von C (viel strenger als C ++), sodass das Problem der Abwärtskompatibilität nicht auftritt. Alles, was Sie in C tun können, können Sie in Objective-C tun.
Eine Obermenge zu sein ist binär, wie schwanger zu sein. Obj-C ist eine Obermenge von C und C ++ nicht.
Was meinen sie mit Obermenge? Inwiefern wäre Ziel-C enger // abwärtskompatibel zu C? Inwiefern folgt Objective-C der C-Philosophie genauer als C ++?
Kann ein C-Programm ohne Änderung von einem Objective-C-Compiler kompiliert werden (100% Kompatibilität)?
Dies ist eher eine Frage zum Design und zur Kompatibilität von Programmiersprachen als ein Krieg, um den es besser geht.
quelle
Sie bedeuten strenge Obermenge. Jedes gültige C-Programm wird mit einem Objective-C-Compiler kompiliert. Einige gültige C-Programme werden nicht mit einem C ++ - Compiler kompiliert.
Hier ist ein einfaches Beispiel:
Kompiliert in C und Objective-C, jedoch nicht in C ++. Es gibt natürlich auch andere Beispiele.
Alle - Objective-C ist eine strikte Obermenge von C.
Ja.
quelle
Von Grund auf wurde C ++ als "besseres C" konzipiert, um sowohl reale als auch wahrgenommene Designlücken zu schließen, während die Autoren von C ++ die Sprache durchgingen. Das Ergebnis dieser Entwurfsentscheidung war,
X
dass ein gültiges C-Programm nicht garantiert, dassX
es kompiliert oder gar ausgeführt wird, wenn es vom C ++ - Compiler verarbeitet wird. Die Änderungen berührten grundlegende Konstrukte wie String-Literale (sie wurdenconst char*
), Zuweisung vonvoid
Zeigern, Konvertierungen zwischenenum
s- und Integraltypen, Semantik von zusammengesetzten Zuweisungsoperatoren usw.Darüber hinaus wurden nach der Einführung von C99 Funktionen, die es in den aktualisierten C-Standard schafften, aus dem aktualisierten C ++ - Standard weggelassen. Auch hier wurden sehr wichtige Sprachfunktionen ausgelassen - insbesondere bestimmte Initialisierer und Arrays mit variabler Größe.
Im Gegensatz dazu wurde Objective C als Obermenge von C positioniert, sodass alle gültigen C-Programme mit einem Objective C-Compiler kompilierbar sein müssen.
quelle
int nil = 0; nil++;
nicht als Objective-C kompiliert wird. Was ist das Problem dort, ist es offensichtlich, dass Objective-C Header zur Verfügung stellt, die, sobald sie enthalten sind, Ihren Code genau wie C-Header beschädigen können? Und daher hätte der Autor dieses Ausschnitts sie nicht aufnehmen sollen."Objective-C ist eine Obermenge von C" bedeutet, dass jedes gültige C-Programm ein gültiges Objective-C-Programm ist (mit derselben Bedeutung).
Es wird manchmal gesagt, obwohl nicht von C ++ - Experten, dass C ++ eine Obermenge von C ist. Dies ist nicht korrekt, weshalb Ihr Zitat einen großen Vergleich zwischen beiden macht.
quelle
Objective C ist eine Reihe abwärtskompatibler Erweiterungen für C. Dies ist möglich, da die Objective C-Funktionen auf zwei sehr einfache Arten abgegrenzt sind:
@
. Dieses Zeichen wird derzeit in der Sprache C nicht verwendet.[obj method:argument]
. In C werden eckige Klammern auf sehr spezielle Weise für die Array-Subskription verwendet. Dies ist also eine ungültige C-Syntax. Erweiterungen, die auf einer ungültigen Syntax aufbauen, ändern nichts an der Bedeutung von Elementen, die in der Hostsprache gültig sind.So leicht zu erkennen, dass kein Programm, das Objective C-Erweiterungen verwendet, ein streng konformes ISO C-Programm sein kann, egal wie einfach. Darüber hinaus kann jedes ISO C-Programm per Definition als gültiges Objective C-Programm deklariert werden. Ziel C kann Entwicklungen wie C99 und C11 leicht verfolgen.
Andererseits ist C ++ nicht einfach eine Erweiterung von C; Es ist eine andere Sprache, die die Bedeutung einiger Syntax von C ändert. C ++ und C werden separat verwaltet, und daher ändert sich ihre Beziehung im Laufe der Zeit. Zum Beispiel hat C neue Funktionen erworben, die in C ++ vollständig fehlen und wahrscheinlich nicht in C ++ integriert werden, wie z. B. C99-Arrays mit variabler Länge. C ++ kann neue C-Funktionen nicht einfach aufnehmen.
Wenn Sie ein portables C-Programm schreiben, sollte es gleichzeitig ein Objective C-Programm sein. Es ist jedoch zusätzliche Sorgfalt erforderlich, damit es sich auch um ein C ++ - Programm mit derselben Bedeutung handelt. (Diese Praxis ist nicht ungewöhnlich und der erforderliche Dialekt wird informell als "Clean C" bezeichnet.)
Ein triviales Beispiel für ein C-Programm, das bei Behandlung als C ++ unterbrochen wird, ist jedes C-Programm, das ein C ++ - Schlüsselwort als Bezeichner verwendet, z. B.
class
odervirtual
. Ziel C führt keine reservierten Schlüsselwörter ein. Es hat neue Schlüsselwörter, die vom@
Charakter eingeführt werden , wie z@interface
.quelle