¿Por qué alguien usaría C sobre C ++? [cerrado]

132

Aunque parece que a la gente le gusta quejarse de C ++, no he podido encontrar mucha evidencia de por qué querría elegir C sobre C ++. C no parece tener tanta flak y si C ++ tiene todos estos problemas, ¿por qué no puede limitarse al subconjunto de C? ¿Cuáles son tus pensamientos / experiencia?

Simucal
fuente
el enlace duplicado exacto ya no funciona ..... dice el tipo que llega tarde a la fiesta c :)
kyle
44
C es realmente mejor y más simple que C ++, pero cualquier programador de C puede convertir C ++ a C y reír.
BobRun
11
Lo espantoso es que la gente en general piensa que "++" significa que esto es realmente bueno, lo siento, pero no lo es.
BobRun
Además de lo obvio (dispositivos pequeños / integrados), generalmente C es mejor para los problemas de cálculo de números puros (por ejemplo, procesamiento de gráficos de GPU, cálculos de física masivamente paralelos, minería de patrones, etc.) donde las características de OOP son una hinchazón. C ++ es mejor para sistemas de modelado donde interactúan 'cosas', mucho más fácil con las capacidades de OOP.
Paceman
3
Debido a que JavaScript, las mejores prácticas, c ++ y OOP son estúpidos / demasiado ocupados tratando de resolver estos problemas abstractos que probablemente no existan o que deban resolverse nunca.
Mariscal artesanal

Respuestas:

132

La respuesta de Joel es buena por razones por las que podría tener que usar C, aunque hay algunas otras:

  • Debe cumplir con las pautas de la industria, que son más fáciles de probar y probar en C.
  • Tiene herramientas para trabajar con C, pero no con C ++ (piense no solo en el compilador, sino en todas las herramientas de soporte, cobertura, análisis, etc.)
  • Sus desarrolladores objetivo son gurús C
  • Estás escribiendo controladores, núcleos u otro código de bajo nivel
  • Usted sabe que el compilador de C ++ no es bueno para optimizar el tipo de código que necesita escribir
  • Su aplicación no solo no se presta para ser orientada a objetos, sino que sería más difícil de escribir de esa forma

Sin embargo, en algunos casos, es posible que desee utilizar C en lugar de C ++:

  • Desea el rendimiento del ensamblador sin la molestia de codificar en el ensamblador (C ++ es, en teoría, capaz de un rendimiento 'perfecto', pero los compiladores no son tan buenos para ver las optimizaciones que verá un buen programador de C)
  • El software que está escribiendo es trivial, o casi - saca el pequeño compilador de C, escribe algunas líneas de código, compila y ya está todo listo - no es necesario abrir un editor enorme con ayudantes, no es necesario escribir prácticamente clases vacías e inútiles, tratan con espacios de nombres, etc. Puede hacer casi lo mismo con un compilador de C ++ y simplemente usar el subconjunto de C, pero el compilador de C ++ es más lento, incluso para programas pequeños.
  • Necesita un rendimiento extremo o un tamaño de código pequeño, y sabe que el compilador de C ++ hará que sea más difícil de lograr debido al tamaño y el rendimiento de las bibliotecas.

Afirma que podría usar el subconjunto de C y compilar con un compilador de C ++, pero descubrirá que si lo hace, obtendrá resultados ligeramente diferentes según el compilador.

De todos modos, si estás haciendo eso, estás usando C. ¿Tu pregunta es realmente "¿Por qué los programadores de C no usan compiladores de C ++?" Si es así, entonces no entiendes las diferencias de idioma o no entiendes la teoría del compilador.

Adam Davis
fuente
2
También está el estándar MISRA C, que AFAIK aún no es realmente estable para C ++.
Paul Nathan el
6060
La parte de rendimiento no es necesariamente cierta. Hay muchas áreas donde C ++ puede optimizar mucho mejor que C. (Por supuesto, lo contrario también es cierto en ocasiones, pero en general, elegir C sobre C ++ por razones de rendimiento es una mala idea).
jalf
9
Me interesaría más información sobre el rendimiento. No entiendo por qué C solo funcionaría mejor "ocasionalmente". Dado un programador promedio, puede ser que C ++ haga que el rendimiento sea más fácil de lograr (buen uso de patrones), pero un programa C escrito por un experto debería ser más rápido, menos gastos generales.
Adam Davis
3
Por supuesto, el programa C más rápido tardaría más en escribir y depurar, por lo que hay una compensación, y dada la velocidad de las máquinas, la compensación rara vez vale la pena, excepto para aplicaciones especializadas, por lo que C ++ es generalmente mejor. (para cuando se termina el código, las computadoras son más rápidas y se comen la diferencia)
Adam Davis
21
@Adam: C ++ funciona mejor que C con código "bonito". C ++ puede usar plantillas y funciones en línea donde C necesita una macro. La sobrecarga de C ++ solo aparece cuando se solicita, de lo contrario es lo mismo que C. (virtual, try / throw, dynamic_cast). Gran parte de la sobrecarga solo se muestra en el tamaño de la imagen del programa.
Zan Lynx
88

Me gusta el minimalismo y la simplicidad.

plan9assembler
fuente
9
OK, es justo ... entonces, ¿por qué no Forth?
Jonathan Leffler
14
¿Supongo que también le gusta tener bibliotecas, libros, foros disponibles?
Gnud
30
Me gusta el minimalismo y la simplicidad de su respuesta ... :)
Joe DF
8
De acuerdo. C es muy simple y "pequeño". C siempre se ve igual y si usted es un nuevo contribuyente en un proyecto, es fácil entender cómo funciona. c ++ tiene muchas cosas inútiles y cuando veo un proyecto de c ++ me confundo instantáneamente. Puedo entender a las personas de C ++ (un lenguaje C con capacidades OO) pero C es simplemente más simple y fácil.
user69969
1
También creo que C es un lenguaje mucho más adecuado para escribir algún tipo de bibliotecas, como pequeñas bibliotecas universales, lenguajes de secuencias de comandos y, sí, motores de representación.
keebus
65
  • Porque ya saben C
  • Porque están creando una aplicación integrada para una plataforma que solo tiene un compilador de C
  • Porque mantienen el software heredado escrito en C
  • Estás escribiendo algo en el nivel de un sistema operativo, un motor de base de datos relacional o un motor de videojuegos 3D minorista.
Joel Coehoorn
fuente
44
Algunos microcontroladores solo tienen compiladores C que realmente apestan. Las características básicas de C ++ (espacios de nombres, clases además de funciones virtuales, enumeraciones, declaración de variables en otros lugares además de la parte superior del bloque) son las más valiosas, en mi humilde opinión.
Jason S
2
A partir de esto, parece que elegiría C solo si no hay alternativas razonables.
2
@ Joe: aparte del primer punto, eso lo resume todo. Muchos de los lenguajes posteriores tomaron C y dijeron: 'oye, podemos hacerlo mejor '.
Joel Coehoorn el
1
Convenido. Si no está utilizando las características sofisticadas de C ++, creo que C ++ es monotónicamente una mejor C. Con las características de C ++ más sofisticadas, las cosas se vuelven más discutibles, pero luego el debate generalmente es versus un mayor nivel de abstracción, por ejemplo, Java.
Paul Nathan el
44
La mayoría de los motores de juegos en 3D usan C ++, de hecho. UE4 usa C ++, principalmente.
Aditya Kashi
56

El miedo al rendimiento o la hinchazón no son buenas razones para renunciar a C ++. Cada idioma tiene sus posibles trampas y desventajas: los buenos programadores aprenden sobre esto y, cuando sea necesario, desarrollan estrategias de afrontamiento, los programadores pobres caerán y culparán al lenguaje.

Python interpretado se considera en muchos sentidos como un lenguaje "lento", pero para tareas no triviales, un programador experto de Python puede producir fácilmente código que se ejecute más rápido que el de un desarrollador de C sin experiencia.

En mi industria, los videojuegos, escribimos código de alto rendimiento en C ++ evitando cosas como RTTI, excepciones o funciones virtuales en bucles internos. Estos pueden ser extremadamente útiles pero tienen problemas de rendimiento o de hinchazón que es deseable evitar. Si tuviéramos que ir un paso más allá y cambiar completamente a C, ganaríamos poco y perderíamos las construcciones más útiles de C ++.

La razón práctica más importante para preferir C es que el soporte está más extendido que C ++. Hay muchas plataformas, particularmente las integradas, que ni siquiera tienen compiladores de C ++.

También está la cuestión de la compatibilidad para los vendedores. Mientras que C tiene un ABI (Interfaz binaria de aplicación) estable y bien definido, C ++ no. El ABI en C ++ es más complicado debido a cosas como vtables y constructores / destructores, por lo que se implementa de manera diferente con cada proveedor e incluso con versiones de una cadena de herramientas de proveedores.

En términos reales, esto significa que no puede tomar una biblioteca generada por un compilador y vincularla con código o una biblioteca de otro, lo que crea una pesadilla para proyectos distribuidos o proveedores de middleware de bibliotecas binarias.

Andrew Grant
fuente
77
"Python interpretado se considera en muchos sentidos como un lenguaje" lento ", pero para tareas no triviales, un programador experto de Python puede producir fácilmente código que se ejecute más rápido que el de un desarrollador de C sin experiencia". Supongo que un programador (no necesariamente un Python Progammer) que tomó lecciones de algoritmos puede producir código que se ejecuta más rápido que el de un desarrollador inexperto (en general).
Andrei Ciobanu
15
Y ese mismo dev sin experiencia producirá código de Python que es más lento que su código de C. Python es mucho más lento que c.
Millie Smith
37

Elijo escribir en C porque me gusta trabajar con un lenguaje pequeño y apretado. Me gusta tener acceso a un estándar que se puede leer en un período de tiempo razonable (para mí, soy un lector muy lento). Además, lo uso para escribir software para sistemas integrados para los que existen pocos compiladores C ++ deseables (como algunos microcontroladores PIC).

luego
fuente
re: PICs - Siento tu dolor. Si alguna vez tengo que hacer mucho código PIC, probablemente usaré el compilador IAR que admite C ++. Lo he usado en el MSP430 y es bastante bueno.
Jason S
1
Y no olvide los tiempos de compilación mejorados para C. Sin sistema de plantillas.
Ingeniero
35

Considero la otra vista: ¿por qué usar C ++ en lugar de C?

El libro El lenguaje de programación C (también conocido como: K&R) le dice claramente cómo hacer todo lo que el lenguaje puede hacer en menos de 300 páginas. Es una obra maestra del minimalismo. Ningún libro de C ++ se acerca.

El contraargumento obvio es que lo mismo podría decirse de la mayoría, si no de todos, los idiomas modernos: tampoco pueden decirle cómo hacer todo en solo unos pocos cientos de páginas. Cierto. Entonces, ¿por qué usar C ++ en su lugar? ¿Riqueza de características? ¿Poder? Si necesita algo más rico o poderoso, vaya con C #, Objective C, Java o algo así. ¿Por qué cargar con las complejidades de C ++? Si necesita el grado de control que C ++ otorga, entonces argumento que usar C. C puede hacer cualquier cosa y puede hacerlo bien.

Dinah
fuente
Estoy de acuerdo. Quiero poder, así que uso algo realmente poderoso, no el punto medio.
Dinah
77
@Dinah: El punto de paso medio le brinda un poder de expresión de mayor nivel sin el rendimiento y el costo de memoria de C # o Java.
Zan Lynx
55
@Zan Lynx: tienes razón. Pero espero, al adoptar la postura opuesta que hice en mi publicación original, hice un comentario sobre la viabilidad de C sobre C ++ ... incluso si, como usted señala, no es un caso abierto y cerrado.
Dinah
28

Además de varios otros puntos mencionados ya:

Menos sorpresa

es decir, es mucho más fácil ver qué hará exactamente un fragmento de código . En C ++, debe acercarse al nivel de gurú para poder saber exactamente qué código genera el compilador (pruebe una combinación de plantillas, herencia múltiple, constructores autogenerados, funciones virtuales y mezcle un poco de magia de espacio de nombres y búsqueda dependiente de argumentos).

En muchos casos, esta magia es agradable, pero, por ejemplo, en sistemas en tiempo real realmente puede arruinar tu día.

jdisk
fuente
27

La respuesta de Linus a su pregunta es "Porque C ++ es un lenguaje horrible"

Su evidencia es anecdótica en el mejor de los casos, pero tiene un punto ...

Al ser más un lenguaje de bajo nivel, lo preferiría a C ++. C ++ es C con bibliotecas adicionales y soporte de compilador para funciones adicionales ( ambos idiomas tienen características que el otro idioma no tiene e implementan cosas de manera diferente ), pero si tiene con el tiempo y la experiencia con C, puede beneficiarse de poderes relacionados adicionales de bajo nivel añadidos ... [Editado] (porque se acostumbra a hacer más trabajo manualmente en lugar de beneficiarse de algunos poderes que provienen del lenguaje / compilador en sí)

Agregar enlaces:

¿Por qué C ++ para incrustado?

¿Por qué sigues usando C? PDF

Me google para este .. porque hay un montón de comentarios en la web ya

Ric Tokyo
fuente
17
Hice mucha codificación en C, luego un breve período de tiempo en C ++, luego un tiempo embarazosamente largo con VB, y ahora he estado usando C # durante los últimos años. He escrito un poco de código C y C ++ desde entonces y me he dado cuenta de que C está bien definido y ajustado, C # es genial y poderoso, y C ++ simplemente apesta.
CMPalmer
25
Linus no está realmente calificado para hablar sobre los méritos de C ++. Citarlo como si fuera una especie de oráculo es una estupidez. Y lo de "hacer las cosas de la manera difícil" no tiene sentido. Hay buenas razones para usar C, pero "es más trabajo", o "dijo Linus", no están entre ellas.
jalf
8
@jalf, sin citar a Linus como si fuera una especie de oráculo, es bueno mencionar la opinión de un programador conocido sobre sus elecciones en uno de los programas más utilizados en el mundo: el kernel de Linux. La pregunta pide opiniones (por qué alguien elegiría C) es lo que pretendía responder.
Ric Tokyo
66
Linus es una mala fuente de opiniones sobre C ++ porque no lo usa y, que yo sepa, solo lo intentó una vez en 1990, algo así.
Zan Lynx
3
@Zan Linus mostró más autocontrol en otros lugares: "Nos hubiera gustado usar C ++ y las características adicionales que trae, pero es más difícil ver dónde está el código incorrecto en C ++ que en C". La cita en mi respuesta es un registro de una opinión en lugar de un "sigue al líder".
Ric Tokyo
26

Porque están escribiendo un complemento y C ++ no tiene ABI estándar.

Michel
fuente
9
Aunque es cierto, no es una razón convincente para apegarse a C porque puede exportar las funciones necesarias usando el enlace C y aún así mantener su implementación en C ++.
codelogic el
2
@codelogic: los proyectos C ++ tienden a exportar muchos más tipos y funciones que los proyectos C equivalentes. Es posible ocultar esto en una biblioteca compartida final, pero posiblemente sea más esfuerzo de lo que vale.
Tom
tbh no es una respuesta realmente buena pero +1 porque C ++ no tiene ABI estándar (sí ... C ++ apesta)
Hasen
66
C tampoco tiene ABI estándar.
Stephen Canon
25

Los largos tiempos de compilación pueden ser molestos. Con C ++ puede tener tiempos de compilación muy largos (lo que significa, por supuesto, ¡más tiempo para Stack Overflow!).

Franco
fuente
¿Por qué fue rechazado? Yo mismo trabajo mucho en C ++ y no volvería a C, pero puede tener tiempos de compilación dolorosamente largos (piense en las plantillas, por ejemplo).
Frank el
66
Uso C ++ para trabajo real, pero siempre hago prototipos en C debido a los tiempos de compilación casi instantáneos.
Tom
Hmm, cuando se hace de la manera correcta, es decir, no haber hinchado we-may-need-these- # include y not-sure-which-is-the-right-include-so-i-will-include-them-all- # incluye los tiempos de compilación son ordenadas. Cuando pirateo uno o tres archivos, me lleva solo 1-2 segundos compilar mis 100 proyectos KLOC.
Sebastian Mach
44
@Tom: Me pregunto cómo será tu trabajo real en C ++, si puedes crear un prototipo en C. ¿No estás usando las capacidades de C ++? ¿Puedes elaborar?
Sebastian Mach
24

Estoy acostumbrado a usar C ++ para mis proyectos. Luego obtuve un trabajo en el que se usa C simple (una base de código en evolución de 20 años de un software AV con poca documentación ...).

Las 3 cosas que me gustan en C son:

  • Nada está implícito: ves lo que tu programa hace o no hace exactamente. Esto facilita la depuración.

  • La falta de espacios de nombres y sobrecargas puede ser una ventaja: si desea saber dónde se llama una determinada función, simplemente revise el directorio del código fuente y se lo indicará. No se necesitan otras herramientas especiales.

  • Redescubrí el poder de los punteros de función. Básicamente te permiten hacer todas las cosas polimórficas que haces en C ++, pero son aún más flexibles.

Calmarius
fuente
8
Sin embargo, dicho polimorfismo en C generalmente se obtiene a través de void *, lo cual es peligroso ya que deshabilita cualquier habilidad del compilador para verificar si estás haciendo algo desagradable.
gd1
44
@ gd1 En la práctica no puedo recordar un solo caso cuando esto void*causó problemas. Hay muchas técnicas de programación defensiva para protegerse contra errores: poner afirmaciones en todas partes, agregar números mágicos a sus estructuras (en versiones de depuración), etc. Pero hoy en día tenemos valgrind, dr. memoria, e incluso MSVC instrumenta el código para detectar problemas, por lo que los problemas de corrupción de memoria son bastante fáciles de resolver.
Calmarius
44
Casi nunca experimento daños en la memoria en mis programas, pero si es posible, preferiría detectar errores antes de ejecutar el programa. Fundición void*a whatever*es algo que el compilador acepta de buena fe. Prefiero que mi compilador no confíe en mí y tenga la posibilidad de aplicar controles de tipo robustos. Los errores de sustitución de plantillas emitidos por los compiladores de C ++ son difíciles de leer, pero al menos la basura no se compila.
gd1
1
@ gd1 Volviendo a su primer comentario, no sé cuánta experiencia tiene con técnicas de procedimiento (veo que está activo en su mayoría en etiquetas OO). El void*generalmente se puede evitar. El patrón típico al agregar un comportamiento personalizado es pasar un puntero de función y un void*para datos de usuario. Una interfaz genérica generalmente se ve así. Luego, la biblioteca pasa esto de void*nuevo a su devolución de llamada sin hacer nada más con él. La mayoría de las veces no tiene datos adicionales, por lo que pasa NULL e ignora el parámetro de usuario en su devolución de llamada. Supuse que sabías esto.
Calmarius
@Calmarius "La mayoría de las veces no tienes datos adicionales" -> Esta es realmente la ventaja del polimorfismo. Es fácil vincular datos adicionales, sin utilizar punteros nulos. Entonces, su excusa es básicamente "Realmente no uso esa característica de todos modos".
user2445507
15

Me sorprende que nadie mencione las bibliotecas. Se pueden vincular muchos lenguajes contra C libs y llamar a funciones C (incluido C ++ con "C" externa). C ++ es prácticamente lo único que puede usar una libra C ++ (definida como 'una lib que usa características en C ++ que no están en C [como funciones sobrecargadas, métodos virtuales, operadores sobrecargados, ...], y no exporta todo a través de interfaces C compatibles a través de "C" externo ').

BigSandwich
fuente
1
No tan; puede mostrar "C" o __cdecl sus funciones para exponerlas a C.
Crashworks
Genial, pero ¿con qué otros idiomas funciona eso?
BigSandwich
2
una C lib puede funcionar en muchos más lugares.
BigSandwich
1
Todos los que pueden vincularse a C.
Crashworks
2
La razón más obvia para los problemas de interoperabilidad es el cambio de nombre, y creo que vale la pena mencionarlo.
Tom
15

Si desea que su código sea entendido por prácticamente cualquier programador, escriba en C.

Liran Orevi
fuente
12

Porque quieren usar funciones en C99 que no tienen equivalentes en C ++.


Sin embargo, no hay tantas características de C99 que sean útiles para C ++ como la gente piensa a primera vista. Matrices de longitud variable? C ++ tiene std :: vectores. ¿Soporte para números complejos / imaginarios? C ++ tiene un tipo complejo con plantilla. Funciones matemáticas de tipo genérico? C ++ sobrecargó las funciones matemáticas estándar, causando el mismo resultado.

Inicializadores con nombre? No en C ++, pero hay una solución alternativa:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

Esto te permite escribir cosas como:

My_class mc(My_class_params().set_i(5).set_name("Me"));
Max Lybbert
fuente
¡Escucha Escucha! La falta de inicializadores designados con nombre en C ++ me vuelve loco cada vez que tengo que usarlo.
Ephemient
2
Estoy con 100% en los inicializadores !!!
Juez Maygarden el
Si desea inicializar una estructura global fuera de una función (por lo que no puede .set _ * ()), C ++ le obliga a usar una sintaxis de inicializador sin nombre, o escribir un constructor para su estructura. No me gusta ninguna de esas opciones.
ephemient
También hay VLA en C99 (GCC) con los que es mucho más fácil trabajar que std:vector.
Vahid Amiri
10

Porque para muchas tareas de programación, C es más simple y lo suficientemente bueno. Cuando estoy programando utilidades livianas especialmente, puedo sentir que C ++ quiere que construya una superestructura elegante por sí misma, en lugar de simplemente escribir el código.

OTOH, para proyectos más complejos, la elegancia proporciona un rigor estructural sólido más bueno que el que fluiría naturalmente de mi teclado.

dkretz
fuente
8

La mayoría de las características importantes de c ++ de alguna manera involucran clases o plantillas. Estas son características maravillosas, excepto por la forma en que el compilador las transforma en código objeto. La mayoría de los compiladores usan el cambio de nombre, y los que no hacen algo al menos tan desordenado.

Si su sistema vive solo, como es el caso con muchas aplicaciones, entonces C ++ es una buena opción.

Si su sistema necesita interactuar con un software que no está necesariamente escrito en C ++ (con mayor frecuencia en ensamblador, o Bibliotecas Fortran), entonces está en una situación difícil. Para interactuar con ese tipo de casos, deberá deshabilitar el cambio de nombre para esos símbolos. esto generalmente se hace declarando esos objetos extern "C", pero no pueden ser plantillas, funciones sobrecargadas o clases. Si es probable que esas sean las API de sus aplicaciones, deberá envolverlas con funciones auxiliares y mantener esas funciones sincronizadas con las implementaciones reales.

Y, en realidad, el lenguaje C ++ proporciona una sintaxis estándar para características que se pueden implementar fácilmente en C.

En resumen, la sobrecarga de C ++ interoperable es demasiado alta para que la mayoría de las personas lo justifiquen.

TokenMacGuy
fuente
3
Estoy muy sorprendido de escuchar esto porque he escrito tantos .DLL en C ++ que tenían interfaces externas "C" para poder llamarlos desde C o cualquier otro lenguaje CLR. Ciertamente, no puede exponer simplemente punteros de funciones miembro, pero en realidad no es mucho problema reunir datos para llamar a __cdecl.
Crashworks
1
En realidad, puede exportar código con plantilla. Solo requiere envoltorios de funciones sin plantilla para cada tipo que desee usar para evitar colisiones de nombres.
Juez Maygarden el
8

Esto es bastante superficial, pero como estudiante ocupado elegí C porque pensé que C ++ tardaría demasiado en aprender. Muchos profesores de mi universidad no aceptan tareas en Python y necesitaba recoger algo rápidamente.

vinc456
fuente
8
¡Sabio de tus maestros!
Andrei Ciobanu
6

Una observación acerca de "simplemente use el subconjunto de C ++ que desea usar": el problema con esta idea es que tiene un costo para exigir que todos en el proyecto usen el mismo subconjunto. Mi propia opinión es que esos costos son bastante altos para proyectos acoplados libremente (por ejemplo, los de código abierto), y también que C ++ falló totalmente en ser una mejor C, en el sentido de que no puede usar C ++ donde sea que haya usado C.

David Cournapeau
fuente
6

Oh, C vs C ++, una excelente manera de comenzar una guerra de llamas. :)

Creo que C es mejor para el controlador y el código incrustado.

C ++ tiene algunas características excelentes que C no tiene, pero muchas de las características orientadas a objetos de C ++ pueden causar problemas de codificación monumentales cuando las personas escriben código con efectos secundarios no obvios que ocurren detrás de escena. El código loco puede ocultarse en constructores, destructores, funciones virtuales, ... La belleza del código C es que el lenguaje no hace nada no obvio a sus espaldas, por lo que puede leer el código y no tener que mirar a cada constructor y destructor y así. Gran parte del problema son las malas prácticas de codificación de ALGUNAS personas.

Mi lenguaje perfecto sería una combinación de C99 más un subconjunto mínimo de capacidades C ++ más seguras que agregan una sobrecarga del compilador CERO (o casi cero) a la salida binaria. Las adiciones perfectas serían la encapsulación de clase y los conceptos de nombres de datos y funciones.

Iluminación
fuente
Llámalo C + o C100: _)
m3nda
4

No he podido encontrar mucha evidencia de por qué querrías elegir C sobre C ++.

Difícilmente se puede llamar evidencia a lo que estoy a punto de decir; Es solo mi opinión.

A la gente le gusta C porque encaja perfectamente en la mente del programador.

Hay muchas reglas complejas de C ++ [cuándo necesita destructores virtuales, cuándo puede llamar a métodos virtuales en un constructor, cómo interactúan la sobrecarga y la anulación, ...], y dominarlos a todos requiere mucho esfuerzo. Además, entre referencias, sobrecarga del operador y sobrecarga de funciones, comprender un fragmento de código puede requerir que comprenda otro código que puede o no ser fácil de encontrar.

Una pregunta diferente es por qué las organizaciones preferirían C sobre C ++. No lo sé, solo soy un pueblo ;-)

En defensa de C ++, trae características valiosas a la mesa; Sin embargo, el que más valoro es probablemente el polimorfismo paramétrico ('ish): operaciones y tipos que toman uno o más tipos como argumentos.

Jonas Kölker
fuente
2
++score: Su afirmación "A la gente le gusta C porque encaja muy bien en la mente del programador" es muy buena. Poder programar en un lenguaje simple donde sabes que lo que ves es lo que obtienes es una propiedad realmente atractiva para un lenguaje de programación.
tchrist
3

Diría que C le brinda un mejor control sobre la optimización y la eficiencia que C ++ y, por lo tanto, sería útil en situaciones en las que la memoria y otros recursos son limitados y cada optimización ayuda. También tiene una huella más pequeña, por supuesto.

Chris
fuente
¿Puedes dar ejemplos de estos?
Andrew Grant
Entonces, ¿el mismo código C compilado usando un compilador C será más eficiente que si se compila usando un compilador C ++?
Steve Kuo el
1
Hace años, el núcleo de Linux se podía compilar con gcc o g ++, pero g ++ creó un código más lento ( tux.org/lkml/#s15-3 en "Finalmente, mientras que Linus mantiene el núcleo de desarrollo ...").
Max Lybbert
Supongo que estaba pensando más en la línea de poder controlar más cómo se optimiza su código en C sobre C ++. Al igual que un programador que usa lenguaje ensamblador puede ajustar su código con mayor precisión que uno que usa un lenguaje de nivel superior.
Chris
2

También existe el enfoque que toman algunas tiendas de usar algunas de las funciones de C ++ de forma similar a C, pero evitando las que son objetables. Por ejemplo, usando clases y métodos de clase y sobrecarga de funciones (que generalmente son fáciles de manejar incluso para los fanáticos de C), pero no el STL, los operadores de flujo y Boost (que son más difíciles de aprender y pueden tener malas características de memoria).

Crashworks
fuente
1

Porque está escribiendo para un sistema donde los recursos son limitados (como un sistema embebido, o algún tipo de código real de metal desnudo como un núcleo) y desea la menor sobrecarga posible.

Hay una razón por la cual la mayoría de los sistemas embebidos no tienen un compilador de C ++: no es que la gente no quiera uno, es que meter código C ++ en ese espacio tan pequeño es una tarea que parece imposible.

Electrones_Ahoy
fuente
3
En realidad, no es tanto un problema de C ++ en sí mismo como un lenguaje, pero la hinchazón patológica que puede causar el uso indiscriminado de plantillas.
Crashworks
1
ecos está en gran parte escrito en C ++. No hay relación entre el lenguaje (en comparación con C) y el tamaño del ejecutable (siempre y cuando sepa qué funciones usar).
user52875
1
"siempre y cuando sepas qué características usar". Ese es el punto - el resultado de decir "bueno, tenemos C ++, pero no podemos apoyar cuenta la mitad de la lengua por razones de arriba" es Symbian / C ++, lo que confunde y Angers ambos programadores de C y los programadores de C ++ ...
Steve Jessop
1
De acuerdo en todos los puntos. Nuestra solución para "saber qué funciones usar" era usar un compilador de C y llamarlo por día. Claro, podríamos haber hecho que C ++ funcionara (lo que habría sido realmente divertido de una manera súper nerd) pero teníamos un producto que enviar y no tuvimos tiempo de preocuparnos por eso.
Electrons_Ahoy
1

Lo que C necesitaba era un mejor preprocesador. Cfront fue uno y por lo tanto nació C ++

Usaría C, donde 'c ++ como preprocesador' no estaría bien.

Estoy bastante seguro de que, en la parte inferior de cualquier biblioteca / framework / kit de herramientas de C ++ bien escrito, encontrará dirty-old-c (o conversiones estáticas, que es lo mismo)

vrdhn
fuente
0
  • Hasta hace unos años, los compiladores de C ++ existentes carecían de características importantes, o el soporte era deficiente y las características admitidas varían enormemente entre ellos, por lo que era difícil escribir aplicaciones portátiles.
  • Debido a que no hay nombres estándar de símbolos, es difícil para otros lenguajes / aplicaciones admitir clases C ++ directamente.
Ismael
fuente