¿Es el objetivo c 2.0 un superconjunto adecuado de C?
-
23-10-2019 - |
Pregunta
He oído que Objective-C es un superconjunto adecuado de C, pero ¿es Objective-C 2.0?
La razón por la que pregunto es que no lo es, o no entendí la frase "superconjunto adecuado", porque este código es válido C sintaxis:
#import <stdio.h>
int main () {
char *nil = "hello";
printf("%s\n",nil);
}
Pero no se compila en Objective-C 2.0. Obviamente, este es un problema fácilmente reparable, pero estoy escribiendo un artículo, y siento que esto es algo que debe señalarse.
Solución
nil
no es una palabra clave. nil
se define en objc.h En Mac OS X] (y __DARWIN_NULL
es realmente solo NULL
):
#ifndef nil
#define nil __DARWIN_NULL /* id of Nil instance */
#endif
Eso es, nil
No es realmente parte del lenguaje compilado, sino una convención utilizada durante la compilación perpetuada por las bibliotecas del sistema.
Dividiendo pelos, obviamente. De verdad pudo compilar la fuente de objetivos-C sin nil
, aunque.
Es similar a preguntar "¿Puedo escribir una herramienta que tenga variables nombradas? deflate
Mientras sigue usando el zlib.h
interfaz? ". Claro. Pero será feo.
Y, de hecho, el El compilador no incluye automáticamente objc.h. Este:
#include <stdio.h>
int main() {
int nil = 5;
fprintf(stdout, "Hello %d\n", nil);
return 0;
}
Se compila y ejecuta bien en un proyecto de herramienta de base estándar (en main.m) una vez que elimina el encabezado precompilado/prefijo que importa base y, por lo tanto, objc.h. (Entonces, sí, fuera de la caja, las plantillas de Xcode hacer causa objc.h
ser importado a través de importar Cocoa/Cocoa.h
o Foundation/Foundation.h
.)
Otros consejos
Objetivo-C Un superconjunto adecuado de C, ya que todo lo que funciona en C funcionará con Objective-C.
PERO,
Como es un superconjunto, agrega algunos Nuevos tipos, definiciones y directivas.
Eso significa que si usa una definición reservada como nil
, te estás metiendo en serios problemas.
Es por eso que el programa anterior no se compila.