De lo que leí allí: ¿Por qué Objective-C no es muy popular fuera de la comunidad de Apple?
Objective-C es un superconjunto de C (de hecho, mucho más estrictamente que C ++), por lo que no surge el problema de la compatibilidad con versiones anteriores. Todo lo que puede hacer en C, lo puede hacer en Objective-C.
Ser un superconjunto es binario, como estar embarazada. Obj-C es un superconjunto de C y C ++ no lo es.
¿Qué quieren decir con superconjunto? ¿De qué manera el objetivo-C sería más cercano // compatible con versiones anteriores de C? ¿De qué manera objetivo-C sigue la filosofía de C más de cerca que C ++?
¿Se puede compilar cualquier programa en C sin modificaciones mediante un compilador de objetivo-C (compatibilidad 100%)?
Esta es más una pregunta sobre el diseño y la compatibilidad del lenguaje de programación que una guerra sobre cuál es mejor.
fuente
Significan superconjunto estricto. Cualquier programa C válido se compilará con un compilador Objective-C. Algunos programas C válidos no se compilarán con un compilador C ++.
He aquí un ejemplo sencillo:
int *foo = malloc(12);
Compila en C y Objective-C, pero no en C ++. Por supuesto, también hay otros ejemplos.
Todos: Objective-C es un superconjunto estricto de C.
Si.
fuente
Desde cero, C ++ ha sido diseñado como un "C mejor", solucionando omisiones de diseño, tanto reales como percibidas, a medida que los autores de C ++ pasaban por el lenguaje. El resultado de esta decisión de diseño ha sido que
X
ser un programa C válido no garantiza queX
se compile, y mucho menos se ejecute, cuando sea procesado por el compilador de C ++. Los cambios tocaron construcciones básicas como cadenas literales (se convirtieron enconst char*
), asignación devoid
punteros, conversiones entreenum
sy tipos integrales, semántica de operadores de asignación compuesta , etc.Además, una vez que apareció C99, las características que se convirtieron en el estándar C actualizado se dejaron fuera del estándar C ++ actualizado. Nuevamente, se omitieron características muy importantes del lenguaje, en particular, inicializadores designados y matrices de tamaño variable.
Por el contrario, Objective C se ha posicionado como un superconjunto de C, lo que requiere que todos los programas C válidos sean compilables con un compilador de Objective C.
fuente
int nil = 0; nil++;
no se compila como Objective-C. ¿Cuál es el problema allí? ¿Es obvio que Objective-C hace disponibles encabezados que, una vez incluidos, pueden romper su código exactamente como lo hacen los encabezados C? Y por lo tanto, el autor de ese fragmento no debería haberlos incluido."Objective-C es un superconjunto de C" significa que cada programa C válido es un programa Objective-C válido (con el mismo significado).
A veces se dice, aunque no lo hacen los expertos en C ++, que C ++ es un superconjunto de C. Esto no es exacto, por lo que su cita está haciendo un gran problema al comparar los dos.
fuente
Objective C es un conjunto de extensiones compatibles con versiones anteriores de C. Esto es posible porque las características de Objective C están delimitadas de dos formas muy simples:
@
. Este carácter no se usa actualmente en el lenguaje C.[obj method:argument]
. En C, los corchetes se usan de una manera muy específica para el subíndice de matrices, por lo que esta sintaxis C no es válida. Las extensiones que se basan en una sintaxis no válida no cambian el significado de nada que sea válido en el idioma anfitrión.Es tan fácil de ver que ningún programa que use extensiones Objective C puede ser un programa ISO C estrictamente conforme, no importa lo simple que sea. Además, cada programa ISO C puede declararse, por definición, como un programa Objective C válido. Objective C puede seguir fácilmente desarrollos como C99 y C11.
Por otro lado, C ++ no son simplemente extensiones de C; es un lenguaje diferente que cambia el significado de algunas de las sintaxis de C. C ++ y C se mantienen por separado, por lo que su relación cambia con el tiempo. Por ejemplo, C ha adquirido nuevas características que están completamente ausentes en C ++, y es muy probable que no entren en C ++, como las matrices de longitud variable C99. C ++ no puede recoger fácilmente nuevas características de C.
Si escribe un programa portátil en C, debería ser al mismo tiempo un programa Objective C. Pero se necesitará un cuidado adicional para que también sea un programa C ++ con el mismo significado. (Esta práctica no es desconocida, y el dialecto que requiere se conoce informalmente como "Clean C").
Un ejemplo trivial de un programa en C que se rompe cuando se trata como C ++ es cualquier programa en C que utiliza una palabra clave de C ++ como identificador, como
class
ovirtual
. El objetivo C no introduce palabras clave reservadas. Tiene nuevas palabras clave que son introducidas por el@
personaje, como@interface
.fuente