2010-12-08 36 views
8

Cuando Stroustroup estaba diseñando C++, uno de sus objetivos era que C++ fuera un superconjunto de C tanto como fuera posible. Entiendo que esto no es 100% el caso, pero la mayor parte del código bueno en C también es código C++.Relación entre C y C++

Pero estoy escuchando que C99 admite muchas cosas que C++ no (como VLA) y que incluso va a haber C1x o C0x como se llame. Por lo tanto, C++ es un superconjunto de solo anterior C89 y, a partir de ese momento, C y C++ se desarrollan de forma bastante independiente.

+0

[C + + 0x] (http://en.wikipedia.org/wiki/C%2B%2B0x) es la siguiente versión de C++. – darioo

+2

@darioo: ¿REALMENTE? :) –

+0

@Armen: eso es lo que dicen ;-) editar: pensé que te referías a C++ 0x cuando mencionaste 'C1x' o 'C0x'. – darioo

Respuesta

7

C++ es un superconjunto de C89/C90. (No recomiendo escribir el código con el propósito de poder compilarlo como C o C++). Desde entonces, C99 divergió. El nuevo estándar de C++ (a menudo llamado C++ 0x) tendrá algún intento de ser más compatible, pero no tendrá elementos como los arreglos de longitud variable C99. Stroustrup ha expresado su decepción con algunas de las acciones del comité C, aparentemente al esperar que intenten estar más cerca de la compatibilidad con C++.

Entonces, sí, los idiomas son divergentes.

+0

+1 para "cerca de superconjunto", C está débilmente tipado, mientras que el sistema de tipo C++ no es tan permisivo. –

+1

Se ha dicho que C++ es un superconjunto de la buena C. – MSalters

+1

@MSalters: Dijo que no era del todo correcto, en mi opinión. 'int * foo = malloc (42 * sizeof (int));' es C correcto, pero no se compilará en C++. Agregar el molde '(int *)' al 'malloc' lo hace compilar en C++, pero lo único que hace en C es cubrir si se olvidó de' #include '. Desde que me encontré con ese caso, he sido partidario de saber si estás escribiendo C o C++, y no restringiéndome al subconjunto común. Es cierto que las peores construcciones de C tienden a no funcionar en C++. –

4

Eso es correcto. C++ comenzó como un superconjunto de C cuando se desarrolló originalmente. Desde ese momento, los dos se han vuelto independientes del otro.

+1

No estoy seguro de que C++ haya sido alguna vez un superconjunto estricto de cualquier versión de C. Sin duda, el primer estándar de C++ no era 100% compatible con C. –

+1

@Marcelo: El "Diseño y Evolución de C++" de Stroustrup menciona que la C de 1980 no era completamente compatible con C, ya que 'int class;' era buena C y C ilegal con Clases. La evolución hacia C++ introdujo más incompatibilidades. –

3

Existe un esfuerzo concertado para mantener los idiomas lo más compatibles posible, y C++ 0x adoptará algunos de los cambios de C99. Pero parece probable que diverjan en cierta medida, siendo los VLA la discrepancia más notable. No sé que C++ también adoptará restrict.

+0

El próximo estándar de C++ está casi listo, y no habrá adiciones de funciones. Dado que este es el estándar que incorporaría características de compatibilidad C99, diría que se están alejando. –

+1

@David: ¿Estás en desacuerdo con algo que escribí? –

+0

Nitpicking, supongo. Dijiste que parece probable que divergirían; Estoy diciendo que en la práctica ya han divergido. –

1

Incluso para C antiguo, también conocido como C89, debajo del capó la diferencia es difícil de manejar, los retornos de operadores que son lvalue para uno y no para el otro, flujo de control que es válido para uno y no para el otro, etc. están bien en un nivel de interfaz para funciones con prototipos, struct etc.

En la versión más nueva de los idiomas, esto difiere aún más, ya que incluso la compatibilidad de la interfaz puede ser difícil de mantener. C99 ya tiene la palabra clave static para los límites de los parámetros de función de matriz, los conceptos de constantes de tiempo de compilación son bastante diferentes en ambos idiomas, C++ comienza a reutilizar palabras clave antiguas (auto) y utiliza excesivamente palabras clave nuevas que no están en un espacio de nombre reservado ...

Así que sí, creo que la división crecerá, y probablemente sea mejor para ambas comunidades admitir el divorcio y tratar de llevarse bien por separado.

+0

Creo que ambos ya han "admitido" el divorcio, pero aún así intentan llevarse bien lo más posible, lo que parece una decisión sensata. – jalf

+0

@jalf: Deben romperse. Lo divertido es que si sacas el C de C++, solo deja un lenguaje de pesadilla excesivamente complicado de los 80. Aun así, dadas algunas actualizaciones más, y descartando la ridícula sham de compatibilidad con C, y eliminando toda la sintaxis arcaica y repetitiva, C++ podría en realidad ser un lenguaje decente. No veo que esto sea factible. –

3

un interesante artículo de Bjarne Stroustrup que arroja algo de luz sobre el tema: Sibling Rivalry: C and C++ (pdf)

+0

Gah. Insiste en abusar de la "igualdad" en los idiomas para obtener apoyo. –

1

pero la mayoría de buen código en C es también el código C++.

diría que más bien es el código C compilables utilizando un compilador de C++.
Eso no lo convierte en código C++.

C++ es un superconjunto del antiguo C89 y, a partir de ese momento, C y C++ se desarrollan de forma bastante independiente.

C++ se basó en C89.
C se amplió con C99 muy poco de la que se incorporó en C++ 03
Se están realizando esfuerzos para minimizar la diferencia y llevar a los idiomas más estrechas (cuando sea razonable) para C++ 0x

+1

El dicho afirma que "buen código C también es código C++", no que "buen código C también es * bueno * código C++". Pero sí, esta es una diferencia importante. – aschepler

Cuestiones relacionadas