Frage

Ich habe gehört, dass Objective-C ein ordnungsgemäßes Superset von C ist, aber Objective-C 2.0?

Der Grund, warum ich frage, ist, dass es entweder nicht ist, oder ich verstehe den Ausdruck "Richtige Superset" falsch, da dieser Code eine gültige C -Syntax ist:

#import <stdio.h>

int main () {
    char *nil = "hello";
    printf("%s\n",nil);
}

Kompiliert jedoch nicht in Objective-C 2.0. Offensichtlich ist dies ein leicht behobenes Problem, aber ich schreibe ein Papier und habe das Gefühl, dass dies etwas ist, auf das hingewiesen werden sollte.

War es hilfreich?

Lösung

nil ist kein Schlüsselwort. nil ist definiert in objc.h auf Mac OS X] (und __DARWIN_NULL ist wirklich gerecht NULL):

#ifndef nil
#define nil __DARWIN_NULL   /* id of Nil instance */
#endif

Das ist, nil ist nicht wirklich Teil der kompilierten Sprache, sondern eine Konvention, die während der Zusammenstellung verwendet wird, die von den Systembibliotheken aufrechterhalten wird.

Offensichtlich die Haare spalten. Du wirklich könnte Kompilieren Sie objektive C-Quelle ohne nil, obwohl.

Es ist vergleichbar mit der Frage: "Kann ich ein Tool schreiben, das Variablen benannt hat deflate während immer noch die benutze zlib.h Schnittstelle? ". Sicher. Aber es wird hässlich sein.

Und in der Tat die Der Compiler enthält nicht automatisch objc.h. Dies:

#include <stdio.h>

int main() {
    int nil = 5;
    fprintf(stdout, "Hello %d\n", nil);
    return 0;
}

Kompiliert und läuft in einem Standard -Foundation -Toolprojekt (im Main.m) einwandfrei, sobald Sie den vorkompilierten/Präfix -Header entfernen, der die Foundation importiert, und daher objc.h. (Also ja, aus der Box, die Xcode -Vorlagen tun weil objc.h im Importieren importieren Cocoa/Cocoa.h oder Foundation/Foundation.h.)

Andere Tipps

Ziel-C Ein ordnungsgemäßes Superset von C, da alles, was in C funktioniert, mit Objektiv-C funktioniert.

ABER,

Da es ein Superset ist, fügt es einige hinzu Neue Typen, Definitionen und Richtlinien.

Das heißt, wenn Sie eine reservierte Definition wie verwenden nil, Sie geraten in ernsthafte Schwierigkeiten.

Deshalb kompiliert das obige Programm nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top