¿Cuándo usar C sobre C ++ y C ++ sobre C?

164

He sido introducido en Ciencias de la Computación por un poco más de un año, y desde mi experiencia parece que C y C ++ se consideran tanto ser lenguas "ultrarrápidos", mientras que otros como Python y dichos lenguajes de script son generalmente consideradas algo más lento .

Pero también he visto muchos casos en los que un proyecto de software o incluso uno pequeño intercalaría archivos donde cierto número n de esos archivos se escribiría en C, y un cierto número m de esos archivos se escribiría en C ++.

(También noté que los archivos C ++ casi siempre tienen encabezados correspondientes, mientras que los archivos C no tanto). Pero mi principal punto de investigación es obtener un sentido general de intuición sobre cuándo es apropiado usar C sobre C ++, y cuándo es mejor usar C ++ sobre C. Aparte de los hechos de que (1) C ++ está orientado a objetos, mientras que C no lo es, y (2) las sintaxis son muy similares, y C ++ fue creado intencionalmente para parecerse a C de muchas maneras, no estoy seguro de cuáles son sus diferencias. Me parece que son (casi) perfectamente intercambiables en muchos dominios.

¡Entonces se agradecería que alguien pudiera aclarar la situación! Gracias

Templario oscuro
fuente
44
El uso de C en línea en el código C ++ generalmente es para ciertos módulos que necesitan ser altamente optimizados, hacer un trabajo de muy bajo nivel más cerca del hardware, o son críticos para la integridad de los datos o incluso la seguridad humana y deben ser auditables y demostrados como correctos. En lugar de hacerlo todo en C, la mayor parte del proyecto puede aprovechar las características de C ++ para diseños flexibles, al tiempo que obtiene los beneficios de la rigidez de C en aquellos lugares donde se necesita.
kylben
30
@kylben: Muchos chicos de C ++ le dirán: (1) El rendimiento no es una razón para caer a C (tal vez para evitar virtualy algunas otras características que evitan las optimizaciones, pero, por ejemplo, las no virtualclases no son inherentemente ineficientes, y las plantillas son un poderosa herramienta de abstracción que realmente puede conducir a una mayor eficiencia, por ejemplo, qsortvs std::sort). (2) La alta importancia de la corrección es una razón para usar C ++ (seguridad de tipo, constness, privateRAII para hacer que la gestión de recursos sea manejable, etc.) sobre C. O, para el caso, use Ada o algo en primer lugar.
11
@ Pubby8 No estoy de acuerdo con esto. Si estoy trabajando en un archivo .c y veo que la gente hace esto, tiendo a marcarlos mentalmente como no sabiendo lo que están haciendo. Por ejemplo, no hay necesidad de enviar void*a otro tipo de puntero en el código C, es muy molesto y típico de las personas que no conocen C.
asveikau
44
@kylben: (Es posible que desee aprender a abordar adecuadamente a otros en sus respuestas de comentarios, para que tengan la oportunidad de verlos realmente ). Que "un programador muy familiarizado con la forma en que el compilador convierte C en asm" funcionaría para C ++ tal como bien. Pero eso es simplemente irrelevante: si desea incursionar en asm, simplemente escriba asm en lugar de que un compilador lo cree desde otro idioma. La forma en que lo hace puede cambiar con cada actualización del compilador, después de todo.
sbi
99
En mi humilde opinión ... usas C cuando quieres, para mí: C es mucho más simple y fácil de usar que C ++ ... C ++ podría parecer una "C con clases", pero ya no lo es, ahora es un lenguaje muy complejo, con elementos como constructores virtuales y plantillas.
dysoco

Respuestas:

184

Elige C cuando

  • necesitas un ensamblador portátil (que es lo que C es realmente) por cualquier razón,
  • su plataforma no proporciona C ++ (un compilador de C es mucho más fácil de implementar),
  • necesita interactuar con otros lenguajes que solo pueden interactuar con C (generalmente el mínimo común denominador en cualquier plataforma) y su código consiste en poco más que la interfaz, no haciendo que valga la pena colocar una interfaz C sobre código C ++,
  • piratea un proyecto de código abierto (muchos de los cuales, por diversas razones , se adhieren a C),
  • No sabes C ++.

En todos los demás casos, debe elegir C ++.

revs sbi
fuente
15
También agregaría que C ++ con el modelo de excepción a veces trae más problemas de los que vale, por ejemplo, los núcleos del sistema operativo. Al menos esa es la sensación general que tengo al leer sobre cosas.
Codificador
12
@SF: C es la lengua franca? Eso es nuevo. O más bien, muy viejo. Tal vez si solo conversas con personas que no han aprendido nuevos idiomas en los últimos 20 años, pero diría que el conocimiento de C ya no es muy común.
DeadMG
13
@SF .: Como he escrito en otra parte, he estado en proyectos que ascendieron a millones de LoC, y vi muy pocos meta-cosas en comparación con los proyectos C con su inevitable y ubicuo macro hacker. (OTOH, la capacidad de crear EDSL cuando sea necesario puede ser una herramienta increíblemente poderosa en su caja). En cuanto a C siendo la lengua franca: prefiero mantener mi término de que es el mínimo común denominador. Y no quisiera que personas con habilidades de programación moderadas piratearan un núcleo del sistema operativo.
sbi
18
@Max: Estoy completamente en desacuerdo. C es un lenguaje inútil, a menos que alguna barrera práctica insuperable impida el uso de C ++.
DeadMG
17
@Buttons: Fuiste tú quien hizo un reclamo ("C ++ necesita más memoria"), por lo que deberías ser tú quien lo respalde. Y no, no estoy afirmando que C ++ necesite menos memoria. Lo que estoy diciendo es que las características cuestan, sin importar si el compilador las implementa por usted (funciones virtuales) o usted mismo (matriz de punteros de función).
sbi
88

Hay algunas razones para preferir C. La principal es que tiende a ser más difícil producir ejecutables verdaderamente pequeños con C ++. Para sistemas realmente pequeños, rara vez se escribe mucho código de todos modos, y el espacio ROM adicional que se necesitaría para C ++ en lugar de C puede ser significativo.

Sin embargo, también debo agregar que para sistemas realmente pequeños, C tiene problemas exactamente por la misma razón, y el lenguaje ensamblador es casi la única opción razonable. El rango de tamaños de sistemas dentro de los cuales C realmente tiene sentido es bastante pequeño y se reduce constantemente (aunque lo admito, bastante lentamente).

Otro momento / razón para usar C es proporcionar un conjunto de funciones a las que puede unirse desde prácticamente cualquier otro lenguaje. Usted puede escribir estas funciones en C ++ por definirlas como extern "C"funciones, pero al hacerlo restringe esas funciones a la presentación de una "cara" esencialmente C-vida al mundo - clases, funciones sobrecargadas, plantillas y funciones miembro, etc., no es necesario aplicar. Sin embargo, esto no necesariamente restringe el desarrollo a C: es perfectamente razonable usar todas las características de C ++ internamente , siempre que la interfaz externa se parezca a C.

Al mismo tiempo, tengo que decir que las respuestas de @Toll (por un ejemplo obvio) tienen cosas casi al revés en la mayoría de los aspectos. Generalmente, C ++ escrito razonablemente será al menos tan rápido como C y, a menudo, al menos un poco más rápido. La legibilidad generalmente es mucho mejor, aunque solo sea porque no te entierras en una avalancha de todo el código, incluso para los algoritmos y estructuras de datos más triviales, todo el manejo de errores, etc.

Las plantillas no "solucionan un problema con el sistema de tipos del lenguaje", simplemente agregan una serie de capacidades fundamentales casi completamente ausentes de C y / o C ++ sin plantillas. Una de las intenciones originales era proporcionar contenedores de tipo seguro, pero en realidad van mucho más allá de eso, esencialmente ninguno de los cuales proporciona C en absoluto.

Las herramientas automatizadas también son en su mayoría un arenque rojo: si bien es cierto que escribir un analizador C es menos trabajo que escribir un analizador C ++, la realidad es que al final no hace prácticamente ninguna diferencia. Muy pocas personas están dispuestas o pueden escribir un analizador utilizable para cualquiera de ellos. Como tal, el punto de partida razonable es Clang de cualquier manera.

Como sucede, C y C ++ se usan con bastante frecuencia juntos en los mismos proyectos, mantenidos por las mismas personas. Esto permite algo que de otra manera es bastante raro: un estudio que compara directa y objetivamente la mantenibilidad del código escrito en los dos idiomas por personas que son igualmente competentes en general (es decir, exactamente las mismas personas). Al menos en el estudio vinculado, una conclusión fue clara e inequívoca: "Descubrimos que usar C ++ en lugar de C da como resultado una mejor calidad de software y un menor esfuerzo de mantenimiento ..."

Jerry Coffin
fuente
12
El soporte de herramientas no es un arenque rojo. Por supuesto, hoy en día tenemos un sonido metálico. Pero el soporte de herramientas para C ++ se retrasa considerablemente con respecto a los lenguajes antiguos, incluso en los IDE más importantes. ¿Porqué es eso? Simple, porque hasta hace muy poco no había sonido metálico (y el CCG nunca fue una alternativa). Hasta hace aproximadamente medio año, si necesitabas un código AST de C ++, básicamente no tenías suerte o no tenías miles de dólares (si compraste la interfaz EDG).
Konrad Rudolph
55
+1, y para el registro, escribo regularmente código C ++ para procesadores de 8 bits con ROM de 4KiB.
avakar
2
+1 para una gran respuesta general. Lo que no entiendo (no tengo experiencia wrt. Esto) es ¿por qué (supongo que estamos hablando incrustado?) Un compilador de C debería producir un código ejecutable más pequeño que un compilador de C ++ dado el mismo conjunto de características utilizado ? Tal vez podría proporcionar algunas referencias?
Martin Ba
2
@ Martin: lo principal es que C ++ incluye manejo de excepciones, que (al menos generalmente) agrega un mínimo al tamaño ejecutable. La mayoría de los compiladores le permitirán deshabilitar el manejo de excepciones, pero cuando lo haga, el resultado ya no será C ++. Sospecho que también hay un poco por el simple hecho de que muchos proveedores de compiladores de C ++ simplemente no trabajan tan duro para producir el código de salida más pequeño posible.
Jerry Coffin
3
"Descubrimos que el uso de C ++ en lugar de C da como resultado una calidad de software mejorada y un esfuerzo de mantenimiento reducido ..." esa es la conclusión a recordar.
Stephane Rolland
24

Las diferencias entre C y C ++ ya se han enumerado en detalle aquí . Si bien a veces las personas pueden tener razones legítimas para elegir una u otra (C ++ para OOP o C cuando sienten que las características adicionales de C ++ introducen una sobrecarga indeseable, por ejemplo), en mi experiencia, por lo general, todo se reduce a la preferencia. ¿Qué saben y prefieren las personas que trabajan en este archivo? Creo que esta es la razón la mayor parte del tiempo, ya que es cierto que estos lenguajes abordan aplicaciones críticas de rendimiento.

(Nota al margen : Echa un vistazo a la queja de Linus Torvads sobre por qué prefiere C a C ++. No necesariamente estoy de acuerdo con sus puntos, pero te da una idea de por qué las personas podrían elegir C sobre C ++. Más bien, las personas que están de acuerdo con él podría elegir C por estos motivos.)

Casey Patton
fuente
51
-1por la diatriba de Linus. : - {
sbi
12
¡No menos uno para mí! Jaja. No estoy de acuerdo con Linus, pero es un buen ejemplo de POR QUÉ las personas podrían elegir C sobre C ++ (si creen lo que cree Linus). No estoy comentando sobre la legitimidad de esas razones.
Casey Patton
10
@CaseyPatton: Básicamente, rechazo todas las respuestas que presentan este discurso retórico sin comentar como si fuera un argumento real.
sbi
11
@Coder: no es necesario que conozca la implementación de STL en absoluto. El punto de la STL es que no tiene que conocer la implementación, a menos que se base en un comportamiento no definido por el Estándar, en cuyo caso, ¿por qué molestarse en usar la biblioteca Estándar? Además, es más que un poco loco no gustarle un lenguaje debido a cómo se comportan los desarrolladores. Los programadores de C se comportan como C es un regalo de Dios para el hombre y son demasiado ciegos para ver la verdad obvia de que C ++ ofrece características que son fundamental e intrínsecamente superiores a C, como RAII.
DeadMG
8
@Coder: si termina con tantos shared_ptrs en un solo objeto que desborda el contador interno, lo está haciendo mal. El estándar especificará un tamaño mínimo para el contador, probablemente 32 bits, y es poco realista tener que tener más de 2 mil millones de shared_ptrs en un solo objeto. Incluso si el objeto en sí tenía un tamaño de 0 y usted tenía un asignador de memoria de sobrecarga cero, entonces todavía está consumiendo 16 GB de memoria, solo en shared_ptrs.
DeadMG
13

El principal problema que falta en las respuestas existentes (al momento de esta publicación) es la elección.

Es sencillo. Si, por alguna razón completamente irracional, siente que las excepciones no valen la pena, entonces no tiene que usarlas . Todavía puede tener plantillas, RAII y la biblioteca estándar, y nunca escribir un solo "lanzamiento". Lo mismo ocurre con las plantillas. Si, por alguna razón, sientes que causan una hinchabilidad ejecutable irrevocable (y realmente importante, que solo está en incrustación), entonces sorprende: también puedes usar void * y sizeof (T) todo el día. Nada te obliga a usar ninguna de las funciones de C ++ sobre C.

Es por eso que C ++ es un lenguaje inherentemente superior: puede elegir las características que desea y recurrir a la programación de estilo C cuando no le gusta una característica determinada. Por lo tanto, dado que C ++ es todo lo que C es y más, es un hecho obvio que C ++ es un lenguaje superior. Sugerir lo contrario es como tratar de sugerir que 4 es mayor que 5.

DeadMG
fuente
1
Siguiendo su razonamiento, no hay ningún punto en la pregunta original y, por lo tanto, debe cerrarse. Supongo que la pregunta debería leerse de la siguiente manera: cuándo deberíamos restringirnos al subconjunto C de C ++ (usar C simple) y cuándo tiene sentido usar C ++ completo.
Giorgio
Esto es cierto, pero solo para los casos de una persona que trabaja en su propio pequeño proyecto. En la vida real, casi todos pasan la mitad de su tiempo trabajando en el código de otras personas. Desafortunadamente, la mayoría de las personas "piensan mal" con respecto a esas razones completamente irracionales.
DarenW
1
@DeadMG: ¿Cómo se supone que los asignadores informan errores sin lanzar excepciones? Además, agregar más funciones no es necesariamente mejor cuando todo lo que hace es agregar complejidad o redundancia.
Mankarse
@Mankarse: si compila con las opciones para deshabilitar las excepciones, los asignadores anulan el programa o continúan usando un puntero nulo, dependiendo de la implementación de la biblioteca.
Zan Lynx
44
@Mankarse: desde mi experiencia en 2007 cuando intenté ejecutar un sistema Linux con 1 GB de RAM y sin intercambio, casi todo el software de escritorio falla de manera horrible cuando la asignación de memoria falla de todos modos.
Zan Lynx
9

Cosas sobre C ++ que ponen nerviosos a los programadores de C

Hay mucha magia sucediendo debajo del capó; constructores, destructores, métodos virtuales, plantillas, etc., pueden hacer que el código C ++ sea mucho más fácil y rápido de escribir que el código C equivalente, pero más difícil de entender y razonar (dependiendo de qué tan bien conozca C ++ y sus convenciones asociadas). Algo tan simple como Foo newFoo;invocar una gran cantidad de código, dependiendo de cómo Foose haya definido el constructor de la clase (y cualquier clase de la que dependa). Esta es también la razón por la cual la convención es escribir en ++itlugar de it++iterar a través de un contenedor, ya que el postfix a ++menudo implica una operación de copia costosa.

Dependiendo de lo que esté haciendo, puede haber una sobrecarga no trivial, especialmente para tareas simples. Tome los siguientes dos programas, el primero en C, el segundo en C ++:

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

Comportamiento idéntico, no hay mucha diferencia en términos de fuente, pero en el cuadro SLES 10 en el que trabajo con gcc 4.1.2, el primero genera un ejecutable de ~ 9 kb de tamaño, mientras que el segundo ocupa más de 12.5 kb (sin optimización ), casi un 28% más grande. El stringtipo C ++ es mucho más fácil de trabajar con IMO que la biblioteca de cadenas C, y las secuencias C ++ son mucho más flexibles y personalizables que las secuencias C, pero para un código realmente cerebral como este, puede que no valga la pena la sobrecarga.

C ++ es un lenguaje enorme en comparación con C, con algunas semánticas extremadamente complejas. Se necesita mucho más tiempo para dominar C ++ que C ++, lo que significa que muchas personas que afirman conocer C ++ no lo saben tan bien como creen.

Cosas sobre C que ponen nerviosos a los programadores de C ++

C no es un lenguaje de programación seguro por ningún tramo de la imaginación; no hay comprobación de límites en matrices conduce a un montón de comportamiento explotable (ya sea a través del ahora muerto getsfunción, o mediante scanfel %se %[indicadores de conversión). C ++ al menos le ofrece contenedores que arrojan excepciones si intenta acceder fuera de su rango definido actualmente; todo lo que C te da es (si tienes suerte) una violación de segmentación.

La administración de memoria en C es muy laboriosa y propensa a errores, en comparación con las herramientas que le proporciona C ++. Si está creando su propio contenedor, es responsable de hacer coincidir todas las llamadas mallocy free, asegurarse de que las asignaciones sean exitosas, anular cualquier asignación parcial en caso de error, etc. En C ++, simplemente agrega elementos a Retire los artículos del contenedor. Si hay un problema, se lanzará una excepción.

Del mismo modo, el manejo de errores en C es una molestia en comparación con las herramientas que proporciona C ++ (es decir, excepciones). Lo que es realmente divertido es cuando has asignado un montón de memoria y luego golpeas una pared en tu procesamiento; como debe retroceder, debe liberar esa memoria en el orden correcto. Con los principios C ++ y RAII, esto es (relativamente) fácil de hacer.

Entonces, ¿cuándo uso uno sobre el otro?

Si lo que estás escribiendo es un simple pantano, léelo / muck con él / deshazte de su aplicación, cuyo comportamiento se puede describir de manera clara en términos de entradas y salidas, y el rendimiento es importante, luego prefiere C sobre C ++. De lo contrario, prefiera C ++

John Bode
fuente
2
La administración de memoria es compleja y propensa a errores en algunos casos, pero especialmente en el mundo integrado, a menudo es práctico escribir programas en C usando una asignación de memoria completamente estática. Si el programa se vincula, no puede quedarse sin memoria en tiempo de ejecución. ¿Se pueden lograr fácilmente tales garantías en C ++?
supercat
9

Bjarne Stroustrup mantiene una lista de aplicaciones y compañías que usan C ++; puede discutir sobre la programación procedimental vs OOP todo lo que quiera, pero no puede discutir sobre los resultados de la industria en los últimos 20 años.

C ++ se usa comúnmente para proyectos complejos a gran escala, de múltiples personas, donde personas separadas necesitan trabajar en componentes modularizados. Puede construir y mantener código modularizado en C, por supuesto, pero la naturaleza OOP inherente de C ++ conduce a una modularización, capacidad de prueba y reutilización de código superiores.

La biblioteca estándar de C ++ (STL), en sí misma con solo vectores y mapas, es razón suficiente para usar C ++.

C se usa comúnmente para sistemas embebidos.

Yo personalmente usaría C solo si hay alguna biblioteca que solo tenga una API de C.

stackoverflowuser2010
fuente
19
Su oración final no es una razón para usar C. Puede llamar a las bibliotecas C desde C ++.
user207421
2
Utilicé c ++ para un proyecto DSP, no c
BЈовић
9

Diría que la razón principal por la que elegiría C sobre C ++, es solo cuando tendría que recurrir al tipo de cosas de la NASA "Esto TIENE QUE SER 1000% estable".

C ++ es ~ 99% C cuando miramos el rendimiento, y es mucho más productivo. Entonces, incluso en C, puede escribir código que será más rápido que C ++ (puede usar un subconjunto de C ++ sin excepciones, virtual, transmisión, abstracciones, etc., pero eso es básicamente C), es el momento de optimizar cada maldita cosa Si bien STL se prueba y ya lo hace, le costaría más que la pequeña ganancia de rendimiento que podría lograr, o sacrificar porque los algoritmos STL han sido escritos por grupos de expertos, y probablemente no sea un experto en todo.

Por otro lado, C ++ tiene un montón de abstracciones. Cuando, bajo circunstancias, se escapan, esto te mete en problemas. Y hay pocas personas que conocen el 100% de las trampas de C ++, mientras que, supongo, hay más que conocen todas las trampas de C, por lo que escribir una solución en la que todos los miembros de un equipo entiendan completamente cada paso es mucho más fácil en C.

Ejemplo: ¿Sabe cuándo shared_ptr<smthn>desbordará su recuento de referencia, arrojará una excepción? Cosas como estas no son geniales cuando Shuttle tiene que volver a entrar en la atmósfera, al menos eso creo.

Además, el manejo de excepciones es muy, muy difícil en comparación con los códigos de error. Es difícil ver si la clase es 100% segura para las excepciones y es fácil entrar en filtraciones. Muchas personas de alta reputación han expresado esta opinión.

codificador
fuente
12
¿Y de qué manera exactamente la gestión manual de la memoria es "más estable" que las abstracciones de C ++ std::string? ¿Alguna vez ha tratado de especificar una plataforma donde shared_ptrse desbordaría el contador? Eso sería una gran plataforma divertida. Y si cree que el manejo de excepciones es difícil, debería echar un vistazo a una parte del código C que verifica cada posible error en cada llamada a la función. (Es difícil encontrar ese código, lo admito, pero este es solo un argumento aún más fuerte en contra de su declaración). Lo siento, pero esto es realmente excrementos bovinos.
sbi
12
@Lundin: "Las implementaciones" tiene que ser 1000% estable "no permiten la asignación dinámica de memoria en primer lugar". ¿Y qué te impide hacer exactamente eso en C ++? (Y hacer declaraciones generales sobre mi conocimiento y experiencia en lugar de proporcionar argumentos es un truco retórico bastante barato.)
sbi
10
@Lundin: Es bueno que haya comenzado a proporcionar argumentos, en lugar de retóricas. Pero ellos son débiles. Que haya "olvidado" una de las características principales de C ++ (plantillas), una que hace que el código sea más seguro (porque permite que los algoritmos se ejecuten, y por lo tanto fallan, en tiempo de compilación , eliminando errores de tiempo de ejecución). hable a favor de su conocimiento del idioma que está juzgando. La reducción de C ++ a un lenguaje OO ha sido criticada antes aquí, y por buenas razones. (Además, las clases con la destrucción determinista son una gran herramienta y útiles para la gestión de otros recursos que sólo la memoria.)
SBI
99
@Lundin Por supuesto, no querrás usarlo std::stringsi no quieres una asignación dinámica. Tendrá que utilizar std::basic_string<char, std::char_traits<char>, some_allocator_here>.
Luc Danton
10
@Coder: ¿Qué crees que demuestras con estos? El primero es simplemente un código incorrecto (y sería tan malo informar errores como los valores de retorno), el segundo es un caso para RAII sobre la limpieza manual a la que cada dev de C ++ medio decente animaría, y Joel, tanto como yo Respetarlo, dije algunas cosas con las que estoy totalmente en desacuerdo. Su tapón de entrada única-salida huele mal a un viejo pedo desinformado que nunca estará de acuerdo en que lo que aprendió hace 25 años se supera. ( Eso sí , estaba programando hace 25 años, cuando SESE era el estado del arte.)
sbi
6

C es un ensamblaje portátil con una mejor sintaxis, lo que le da al programador el control total de todo .

C ++, por otro lado, hace mucha magia funky (funciones virtuales, sobrecarga, conversión automática, etc.) que puede no ser deseable cuando quieres asegurarte de que:

  • no uses más memoria de la que quieres
  • no acceda a las páginas de memoria de ninguna manera (la vtable puede estar en cualquier lugar)
  • no invoque demasiado código accidentalmente

Y quiere algo realmente simple para trabajar, ya que está enfocado en el rendimiento.

Simplemente no tiene sorpresas, y eso es muy valioso.

Si lo desea (y lo recomiendo), lea las pautas de codificación de JSF sobre lo que necesita pensar al escribir C ++ para el control de aviónica militar. Hay muchas trampas que debes tener en cuenta y puede que te atrapen. Bjarne era parte de ese documento, por lo que sabe de qué se trata.

Además, C se compila como un troll escaldado golpeado por un rayo. C ++, OTOH, probablemente fue patrocinado por las mismas personas que invirtieron en empresas de SSD. :)

(Personalmente, preferiría C ++, pero no me gusta ... tampoco. ;-P)

Macke
fuente
1
Hay muchas cosas sobre las que C no ofrece control. Intente escribir un código portátil eficiente para multiplicar un uint32_t por un uint32_t para obtener un resultado uint32_t (32 bits inferiores del producto). Si un intes de 64 bits, uno debe emitir al menos un operando para uint64_tevitar un comportamiento indefinido, pero tener que emitir a 64 bits con el fin de calcular un resultado de 32 bits es, por decirlo suavemente, "sorprendente".
supercat
No es. El compilador hace cosas como las asignaciones de registros por usted. No puedo escribir código mantenible en el ensamblado, en CI can.
Nils
2

(dado que tiene igual familiaridad con ambos idiomas)

Vaya con C ++ a menos que no haya un compilador de C ++ para su plataforma. Puede escribir código C ++ sin ninguna parte del lenguaje que no le guste (sin clases, excepciones, herencia virtual, cualquier restricción personal que desee aplicar), y luego, en algún momento en el futuro, si decide que desea algo de esas características después de todo, entonces puedes usarlas fácilmente. Nada en C ++ le impide escribir código de estilo C.

(dados los conjuntos de herramientas equivalentes y el conocimiento del desarrollador) No hay ninguna razón para elegir C sobre C ++ siempre que su plataforma tenga un compilador de C ++. Simplemente puede limitarse al subconjunto del idioma que desea hoy, mientras deja la puerta abierta para una extensión posterior.

luego
fuente
1

Ambos idiomas son excelentes. Creo que varios carteles han detallado las fortalezas y los diversos usos de cada uno. Simplemente agregaré esto:

Veo el lenguaje C perfecto en 4 áreas: 1) Creo que es el mejor lenguaje para usar al aprender cualquier tipo de programación [combinado con algo de ensamblaje y conocimiento del código de máquina], 2) es excelente para escribir controladores, 3) incrustado software, y 4) software del sistema al nivel más bajo.

C ++ es un lenguaje orientado a objetos, pero también puede ser de procedimiento (muy parecido a C). Si está trabajando en proyectos a gran escala, software basado en GUI, software de juegos y otros tipos de software con uso intensivo de gráficos, entonces creo que C ++, Java o incluso Objective-C son su mejor opción. Sin embargo, hay muchos programas de línea de comandos o software de sistema en los que puede encontrar que C ++ es tan bueno o mejor que C.

Jonathan
fuente
0

En mi opinión, falta un punto en esta discusión: es más simple en C proporcionar una interfaz binaria estable desde una biblioteca. Tanto para su uso con otros lenguajes como para C ++.

En C ++, los diferentes compiladores usan diferentes nombres para que los consumidores de una biblioteca compilada con un compilador diferente de la biblioteca puedan tener problemas para usarla. Con C, la interfaz binaria, por lo general, está estandarizada para la plataforma.

Sé que los compiladores de hoy en día a menudo tienen interruptores para producir cosas compatibles con gcc, pero eso no siempre ayuda.

Observo esto en Solaris con relativa frecuencia. La distribución y los diferentes proveedores de software suelen utilizar Sun Studio ya que, especialmente en los sistemas Sparc, a menudo proporciona mejores resultados. Sin embargo, los proyectos de código abierto de Man están escritos con código específico de gcc. Puede ser bastante doloroso hacer que esos trabajen juntos.

johannes
fuente
0

C es probablemente preferible a C ++ cuando se genera el código C (por ejemplo, en implementaciones de lenguajes de nivel superior). Por ejemplo, hay varios compiladores similares a Lisp que emiten código C (por ejemplo , Chicken , Scheme48 ...), pero no conozco ninguno que emita código C ++ genuino (mi herramienta MELT emite código C ++, pero no llamaré a ese código genuino Código C ++, usa muy pocas características de C ++).

El código C también es más fácil de probar semiautomáticamente. Los analizadores estáticos como Frama-C (donde anota su código C con comentarios ACSL para ayudar a la razón comprobante de su código) están disponibles para C, pero no tanto para C ++ 11 completo.

Basile Starynkevitch
fuente