Lo que no me gusta en C y C ++

No lea a programadores profesionales de C / C ++).

En el artículo expreso mi punto de vista, si no está de acuerdo, justifíquelo en los comentarios.
El propósito de este artículo: señalar los inconvenientes de C y C ++ que realmente no me gustan y alentarlo a usar la nueva versión del lenguaje o tal vez incluso ofrecer algunas ideas para mejorar el estándar.

Bueno, es hora de reavivar el holivar.

Creo que todos saben que en C ++ hay líneas terribles. Especialmente si estamos hablando del tipo antiguo, se ha corregido y mejorado mucho en la nueva cadena, pero todavía no hay soporte Unicode (!).

En el estándar C ++ 20, es como ingresar cadenas unicode.

C ++ 20! Y esto a pesar del hecho de que C ++ ha existido desde 1983 .

Abra su IDE favorito e intente compilar el siguiente código:

#include <iostream> #include <cstdio> int main() { char string [256]; std::cout << ": "; gets(string); std::cout << ": " << string; return 0; } 

UPD1: el comentarista dice que krakozyabry solo en Windows. Eso es seguro, olvidé escribir sobre eso.
Pero sigue siendo desagradable.

Compilé en Dev Cpp, el compilador de GCC.

Compilar y ver:



Buena salida de pantalla, ¿eh?

Ahora reemplacemos char string [256] con char * string.

No estoy diciendo que esto debería funcionar, pero el compilador debería haber arrojado el error lo más alto posible.

Tenemos un programa de trabajo que colgó.
Sería mejor si el compilador arroja un error.
Y todo es que el compilador no solo lo compiló, sino que aún no
advertencias emitidas

Aquí hay otra broma:

 #include <iostream> using namespace std; int main(){ int arr[100]={}; cout<<arr[101]<<endl; return 0; } 

Que esperamos El compilador nos dirá que no puede acceder a 101 elementos de la matriz, ya que solo hay 100 elementos, pero compilamos, ejecutamos y vemos ... 32765 (al menos en mi hardware).

Hmm

Ahora probemos este código:

 int i = 5; i = ++i + ++i; std::cout<<i; 

¿Qué crees que traerá?

La respuesta correcta depende del compilador.

En GCC, esto será 14, pero dependiendo de los indicadores de optimización.

Y en otro compilador puede ser fácilmente 12 ...

Creo que todos saben que en C y en las ventajas hay un montón de azúcar sintáctica, que está lejos de ser siempre necesaria.

Por ejemplo std::cout<<4["string"]; este es un código válido
Imprime n, al igual que std::cout<<"string"[4];

Genial, ¿eh?

Y ahora sobre el paciente.
C ++ y la red.
Estos son 2 conceptos muy poco coincidentes.
Simplemente intente descargar la imagen del gato desde su sitio favorito utilizando la biblioteca estándar de C ++.
Esto no era posible antes de la adopción del estándar C ++ 17.
No puede trabajar con JSON en la misma biblioteca estándar.
Gran comentario sobre esto.
En general, trabajar con JSON en C ++ es similar a una pesadilla.
Fuente
¿Crees que la condición siempre será falsa?

 if(sizeof ('a') != sizeof (char)){ //do something } 

No, te equivocas.

Si lo compila como un proyecto de C ++, lo más probable es que la condición no se cumpla.
No debería. [1]
Y si como un proyecto en C, en este caso sizeof ('a') == sizeof (int).
Estas son las cosas.
[1] En general, muchos compiladores C y C ++ diferentes también son un problema.
Debido a que muchas soluciones no están estandarizadas y funcionarán solo en ciertos compiladores.

Por ejemplo, números de 128 bits en C ++. Hay __int128 tipo en gcc y clang, mientras que no está en Visual Studio porque no es un estándar. O, por ejemplo, cadenas en Visual Studio.

 String^ MyString3 = "Hello, world!"; //   GCC 

O, por ejemplo, en el viejo Borland C ++ Builder, puede codificar escrito en Object Pascal.
Y hay muchos de esos momentos.

Un dolor particular es la falta de una lista de paquetes C y C ++.

¿Qué se sigue de esto? Use la nueva versión de C ++, por ejemplo C ++ 17 y se resolverán algunos problemas.

Debo decir que en el competidor más cercano C ++ - Rust no hay la mayoría de los problemas de esta lista, por ejemplo, hay una carga maravillosa, pero por supuesto también es imperfecta.

¿Y qué problemas de C y C ++ conoces?
Escribe en los comentarios.

UPD: parece que muchas personas malinterpretaron mi artículo:
De ninguna manera quiero criticar C / C ++ y decir escribir en el rast.
Solo señalo las deficiencias de C / C ++, porque obtuvieron un poco de eso.

Todo tiene sus inconvenientes, acabo de compartir mis pensamientos.
UPD2:

En los comentarios, muchos escriben que las avispas funcionan de esta manera y generalmente estas son las características. Ustedes están equivocados.
Crece la misma evidencia de que puede crear un lenguaje de programación del sistema en el que no sea tan fácil dispararse en el pie.

Es solo que C / C ++ está lleno de soluciones heredadas que nadie solucionará, porque puede romper la compatibilidad con versiones anteriores.

Y sí, esta es mi opinión, es subjetiva .

Si no está de acuerdo, mejor comentario, en lugar de estúpidamente negativo, porque la opinión de todos nosotros
subjetivamente

Source: https://habr.com/ru/post/es432488/


All Articles