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
virtual
y algunas otras características que evitan las optimizaciones, pero, por ejemplo, las novirtual
clases no son inherentemente ineficientes, y las plantillas son un poderosa herramienta de abstracción que realmente puede conducir a una mayor eficiencia, por ejemplo,qsort
vsstd::sort
). (2) La alta importancia de la corrección es una razón para usar C ++ (seguridad de tipo,const
ness,private
RAII para hacer que la gestión de recursos sea manejable, etc.) sobre C. O, para el caso, use Ada o algo en primer lugar.void*
a otro tipo de puntero en el código C, es muy molesto y típico de las personas que no conocen C.Respuestas:
Elige C cuando
En todos los demás casos, debe elegir C ++.
fuente
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 ..."
fuente
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.)
fuente
-1
por la diatriba de Linus. : - {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.
fuente
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ómoFoo
se 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++it
lugar deit++
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 ++:
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
string
tipo 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
gets
función, o mediantescanf
el%s
e%[
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
malloc
yfree
, 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 ++
fuente
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.
fuente
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.
fuente
std::string
? ¿Alguna vez ha tratado de especificar una plataforma dondeshared_ptr
se 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.std::string
si no quieres una asignación dinámica. Tendrá que utilizarstd::basic_string<char, std::char_traits<char>, some_allocator_here>
.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:
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)
fuente
int
es de 64 bits, uno debe emitir al menos un operando parauint64_t
evitar 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".(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.
fuente
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.
fuente
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.
fuente
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.
fuente