Domanda

Ho sentito che Objective-C è una vera e propria superset del C, ma è Objective-C 2.0?

Il motivo che mi chiedo è che o non lo è, o mi fraintendere la frase 'corretto superset', perché questo codice è valido sintassi C:

#import <stdio.h>

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

Ma non compilare in Objective-C 2.0. Ovviamente, si tratta di un problema facilmente risolvibile, ma sto scrivendo un articolo, e la sensazione che questo è qualcosa che dovrebbe essere sottolineato.

È stato utile?

Soluzione

nil non è una parola chiave. nil è definito in objc.h [su Mac OS X] (e __DARWIN_NULL è in realtà solo NULL):

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

Cioè, nil non è realmente parte del linguaggio compilato, ma una convenzione usata durante la compilazione che si perpetua dai librerie di sistema.

spaccare il capello, ovviamente. È davvero potrebbe compilazione sorgente Objective-C senza nil, però.

E 'simile a chiedere "Posso scrivere uno strumento che ha variabili chiamate deflate mentre ancora utilizzando l'interfaccia zlib.h?". Sicuro. Ma sarà brutto.

E, infatti, il compilatore non include automaticamente objc.h . Questo:

#include <stdio.h>

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

compila e funziona bene in un progetto standard strumento Fondazione (nel main.m) Una volta rimossa la precompilato / prefisso di intestazione che le importazioni Fondazione e, di conseguenza, objc.h. (Quindi, sì, fuori dalla scatola, i modelli di Xcode do causa objc.h da importare a titolo di importazione o di Cocoa/Cocoa.h Foundation/Foundation.h.)

Altri suggerimenti

Objective-C una corretta superset del C, come tutto ciò che le opere in C lavoreranno con Objective-C.

MA,

in quanto è un superset, si aggiunge un po 'di nuovi tipi, le definizioni e le direttive .

Ciò significa che se si utilizza una definizione riservata come nil, si stanno ottenendo in guai seri.

Ecco perché il programma di cui sopra non viene compilato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top