2012-03-30 4 views
3

Betrachten Sie die folgende Quelldatei, die gültig ist C.Wenn Objective C eine strenge Obermenge von C ist, warum kompiliert das dann nicht?

void id() { 
} 
(zumindest sollte)

Ich versuche es mit gcc -c test.m zu kompilieren, aber ich erhalte den folgenden Fehler:

test.m:1: error: ‘id’ redeclared as different kind of symbol 
<built-in>:0: error: previous declaration of ‘id’ was here 

Wenn Obj-C wäre eine strenge Obermenge, würde das nicht bedeuten, dass alle gültigen C-Programme auch Obj-C-Programme sind? Beachten Sie, dass ich weder etwas bin noch verlinke.

Zugegeben, vielleicht macht LLVM (1) etwas Magisches, oder vielleicht ist das ein Fehler darin.

(1): i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Basierend auf Apple Inc. bauen 5658) (LLVM bauen 2336.1.00)

EDIT: Let Ich klärte diese Frage - die Frage ist nicht über die id Teil, ich weiß, dass es eine besondere Bedeutung hat. Mein Punkt ist, dass es allgemein gesagt wird, dass Obj-C eine strenge Obermenge von C ist. Dies kann jedoch nicht der Fall sein, wenn es Schlüsselwörter hat, die mit gültigen C-Programmen in Konflikt stehen.

Also entweder ID ist nicht durch den Compiler reserviert, oder Obj-C ist keine strenge Obermenge. Der Zweck dieser Frage ist zu fragen, was der Fall ist, oder gibt es etwas Offensichtliches, das mir fehlt.

+4

ID ist ein definierter Typ in Objecive-C. – dasdom

+0

'id' ist ein reserviertes Wort in Objective-C. Haben Sie auf Prefix.pch nach Importen gesucht? – jnic

+0

Ich habe keine Präfix-Header, nur test.m. Ich weiß, dass id in Obj-C eine besondere Bedeutung hat. – hrnt

Antwort

5

Superset bedeutet, dass es auch einige zusätzliche Funktionen hinzufügt. Wie id in diesem Fall. Es ist ein definierter Typ in Objective C. Und diese extra features der Obermenge ersetzen immer die Untermenge.

Es ist nur üblich, dass Menschen den Begriff strengen Supersatz verwenden. Sie müssen es mit einer Prise Salz nehmen!

Sehen Sie diese alten Posts in SO für eine ähnliche Diskussion

Is objective C 2.0 a proper superset of C?

Which dialect of C is Objective-C a "strict superset" of?

+1

Danke, ich fürchtete einen Moment, dass niemand meine Frage entsprechend den Kommentaren verstand, die ich erhielt :) – hrnt

0

id ist ein Schlüsselwort für "jede Art von Objekt" in Objective. In C wäre es wahrscheinlich das gleiche wie Schreiben

void int() { 
} 
+1

Also ist Objective C deiner Meinung nach keine strenge Obermenge von C? Schließlich kann es nicht sein, wenn es im gemeinsamen Namensraum in Konflikt stehende Schlüsselwörter einführt. – hrnt

+0

Wenn Ihre Hauptsorge über die Definition von "streng" ist, dann habe ich keine Meinung zu diesem Thema.) Ich erinnere mich nur zu lesen, dass es eine Obermenge von C. – Eimantas

+0

Ja, das ist die Hauptsorge :) Ich habe das Original bearbeitet Frage und ich hoffe, dass ihr Zweck jetzt ein bisschen klarer ist. – hrnt

Verwandte Themen