È oggettiva C 2.0 una corretta superset di C?
-
23-10-2019 - |
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.
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.