Ce que je n'aime pas en C et C ++

Veuillez ne pas lire aux programmeurs C / C ++ professionnels).

Dans l'article, j'exprime mon point de vue, si vous n'êtes pas d'accord, justifiez dans les commentaires.
Le but de cet article: souligner les inconvénients du C et du C ++ que je n'aime vraiment pas et vous encourager à utiliser la nouvelle version du langage ou peut-être même proposer quelques idées pour améliorer le standard.

Eh bien, il est temps de rallumer l'holivar.

Je pense que tout le monde est conscient qu'en C ++ il y a des lignes terribles. Surtout si nous parlons de l'ancien type, beaucoup de choses ont été corrigées et améliorées dans la nouvelle chaîne, mais il n'y a toujours pas de support Unicode (!).

Dans la norme C ++ 20, c'est un peu comme entrer des chaînes unicode.

C ++ 20! Et cela malgré le fait que C ++ existe depuis 1983 .

Ouvrez votre IDE préféré et essayez de compiler le code suivant:

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

UPD1: le commentateur dit que krakozyabry uniquement sur Windows. C'est sûr, j'ai oublié d'écrire à ce sujet.
Mais toujours désagréable.

J'ai compilé dans Dev Cpp, le compilateur GCC.

Compilez et voyez:



Bonne sortie écran, hein?

Remplaçons maintenant la chaîne de caractères [256] par la chaîne de caractères char *.

Je ne dis pas que cela devrait fonctionner, mais le compilateur aurait dû jeter l'erreur aussi haut que possible.

Nous avons eu un programme de travail qui a été suspendu.
Il serait préférable que le compilateur génère une erreur.
Et le tout est que le compilateur non seulement l'a compilé, il n'a pas encore
émis des avertissements.

Voici une autre blague:

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

Qu'attendons-nous? Le compilateur nous dira que vous ne pouvez pas accéder à 101 éléments du tableau, car il n'y en a que 100. Mais nous compilons, exécutons et voyons ... 32765 (au moins sur mon matériel).

Hmm.

Maintenant testons ce code:

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

Que pensez-vous qu'il apportera?

La bonne réponse dépend du compilateur.

Dans GCC, ce sera 14, mais en fonction des indicateurs d'optimisation.

Et dans un autre compilateur, il peut facilement être 12 ...

Je pense que tout le monde sait qu'en C et dans les avantages il y a un tas de sucre syntaxique, qui est loin d'être toujours nécessaire.

Par exemple std::cout<<4["string"]; c'est un code valide
Il affiche n, tout comme std::cout<<"string"[4];

Super, hein?

Et maintenant sur le patient.
C ++ et le réseau.
Ce sont 2 concepts très mal assortis.
Essayez simplement de télécharger l'image du chat depuis votre site préféré en utilisant la bibliothèque C ++ standard.
Cela n'était pas possible avant l'adoption de la norme C ++ 17.
Vous ne pouvez pas travailler avec JSON dans la même bibliothèque standard.
Grand commentaire à ce sujet.
En général, travailler avec JSON en C ++ s'apparente à un cauchemar.
Source
Pensez-vous que la condition sera toujours fausse?

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

Non, tu te trompes.

Si vous le compilez en tant que projet C ++, la condition n'est probablement pas remplie.
Ne devrait pas. [1]
Et si comme un projet C, alors dans ce cas sizeof ('a') == sizeof (int).
Ce sont les choses.
[1] En général, de nombreux compilateurs C et C ++ différents posent également problème.
Parce que de nombreuses solutions ne sont pas standardisées et ne fonctionneront que dans certains compilateurs.

Par exemple, des nombres de 128 bits en C ++. Il existe du type __int128 dans gcc et clang, alors qu'il n'est pas dans Visual Studio car ce n'est pas un standard. Ou, par exemple, des chaînes dans Visual Studio.

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

Ou, par exemple, dans le vieil homme Borland C ++ Builder, vous pouvez coder écrit en Object Pascal.
Et il y a beaucoup de tels moments.

Une difficulté particulière est l'absence d'une liste de packages C et C ++.

Qu'est-ce qui en découle? Utilisez la nouvelle version de C ++, par exemple C ++ 17 et certains problèmes seront résolus.

Je dois dire que chez le concurrent le plus proche C ++ - Rust, il n'y a pas la plupart des problèmes de cette liste, par exemple, il y a une merveilleuse cargaison, mais bien sûr elle est également imparfaite.

Et quels problèmes de C et C ++ connaissez-vous?
Écrivez dans les commentaires.

UPD: il semble que beaucoup de gens ont mal compris mon article:
En aucun cas, je ne veux critiquer C / C ++ et dire écrire sur le rast.
Je souligne simplement les défauts de C / C ++, car ils en ont un peu compris.

Tout a ses inconvénients, je viens de partager mes réflexions.
UPD2:

Dans les commentaires, beaucoup écrivent que les guêpes fonctionnent de cette façon et ce sont généralement les caractéristiques. Vous vous trompez.
La même évidence se développe que vous pouvez créer un langage de programmation système dans lequel il n'est pas si facile de se tirer une balle dans le pied.

C'est juste que C / C ++ regorge de solutions héritées que personne ne résoudra, car cela peut briser la compatibilité descendante.

Et oui, c'est mon avis, c'est subjectif .

Si vous n'êtes pas d'accord - meilleur commentaire, plutôt que bêtement moins, car l'opinion de nous tous
subjectivement.

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


All Articles