Was ich in C und C ++ nicht mag

Bitte lesen Sie nicht für professionelle C / C ++ - Programmierer.

In dem Artikel drücke ich meinen Standpunkt aus, wenn Sie nicht einverstanden sind, begründen Sie dies in den Kommentaren.
Der Zweck dieses Artikels: Auf die Nachteile von C und C ++ hinzuweisen, die mir nicht gefallen, und Sie zu ermutigen, die neue Version der Sprache zu verwenden oder vielleicht sogar einige Ideen zur Verbesserung des Standards anzubieten.

Nun, es ist Zeit, den Holivar wieder zu entfachen.

Ich denke, jeder weiß, dass es in C ++ schreckliche Zeilen gibt. Insbesondere wenn es sich um den alten Typ handelt, wurde in der neuen Zeichenfolge viel behoben und verbessert, aber es gibt immer noch keine Unicode-Unterstützung (!).

Im C ++ 20-Standard ist es so, als würde man Unicode-Strings eingeben.

C ++ 20! Und das trotz der Tatsache, dass C ++ seit 1983 existiert .

Öffnen Sie Ihre Lieblings-IDE und versuchen Sie, den folgenden Code zu kompilieren:

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

UPD1: Der Kommentator sagt, dass Krakozyabry nur unter Windows. Das ist sicher, vergessen, darüber zu schreiben.
Aber immer noch unangenehm.

Ich habe in Dev Cpp, dem GCC-Compiler, kompiliert.

Kompilieren und sehen:



Gute Bildschirmausgabe, oder?

Ersetzen wir nun die Zeichenfolge [256] durch die Zeichenfolge char *.

Ich sage nicht, dass dies funktionieren sollte, aber der Compiler hätte den Fehler so hoch wie möglich werfen sollen.

Wir haben ein Arbeitsprogramm, das hing.
Es wäre besser, wenn der Compiler einen Fehler auslöst.
Und das Ganze ist, dass der Compiler es nicht nur kompiliert hat, sondern noch nicht
Warnungen ausgegeben.

Hier ist ein weiterer Witz:

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

Was erwarten wir? Der Compiler teilt uns mit, dass Sie nicht auf 101 Elemente des Arrays zugreifen können, da es nur 100 Elemente gibt. Aber wir kompilieren, führen und sehen ... 32765 (zumindest auf meiner Hardware).

Hmm.

Testen wir nun diesen Code:

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

Was glaubst du, wird er bringen?

Die richtige Antwort hängt vom Compiler ab.

In GCC sind dies 14, jedoch abhängig von den Optimierungsflags.

Und in einem anderen Compiler kann es leicht 12 sein ...

Ich denke, jeder weiß, dass es in C und in den Pluspunkten eine Menge syntaktischen Zuckers gibt, der bei weitem nicht immer benötigt wird.

Zum Beispiel std::cout<<4["string"]; Dies ist ein gültiger Code
Es gibt n aus, genau wie std::cout<<"string"[4];

Großartig, oder?

Und jetzt zum Patienten.
C ++ und das Netzwerk.
Dies sind zwei sehr schlecht passende Konzepte.
Versuchen Sie einfach, das Katzenbild mit der Standard-C ++ - Bibliothek von Ihrer Lieblingsseite herunterzuladen.
Dies war vor der Übernahme des C ++ 17-Standards nicht möglich.
Sie können nicht mit JSON in derselben Standardbibliothek arbeiten.
Toller Kommentar dazu.
Im Allgemeinen ist die Arbeit mit JSON in C ++ ein Albtraum.
Quelle
Denken Sie, dass die Bedingung immer falsch sein wird?

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

Nein, du liegst falsch.

Wenn Sie es als C ++ - Projekt kompilieren, ist die Bedingung höchstwahrscheinlich nicht erfüllt.
Sollte nicht. [1]
Und wenn wie bei einem C-Projekt, dann in diesem Fall sizeof ('a') == sizeof (int).
Das sind die Dinge.
[1] Im Allgemeinen sind auch viele verschiedene C- und C ++ - Compiler ein Problem.
Weil viele Lösungen nicht standardisiert sind und nur in bestimmten Compilern funktionieren.

Zum Beispiel 128-Bit-Zahlen in C ++. Es gibt __int128-Typ in gcc und clang, während es nicht in Visual Studio ist, weil es kein Standard ist. Oder zum Beispiel Zeichenfolgen in Visual Studio.

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

Oder Sie können beispielsweise im alten Borland C ++ Builder Code in Object Pascal schreiben.
Und es gibt viele solche Momente.

Ein besonderer Schmerz ist das Fehlen einer Liste von C- und C ++ - Paketen.

Was folgt daraus? Verwenden Sie die neue Version von C ++, z. B. C ++ 17, und einige Probleme werden behoben.

Ich muss sagen, dass es im nächsten Konkurrenten C ++ - Rust nicht die meisten Probleme aus dieser Liste gibt, zum Beispiel gibt es eine wunderbare Ladung, aber natürlich ist sie auch unvollkommen.

Und welche Probleme von C und C ++ kennen Sie?
Schreiben Sie in die Kommentare.

UPD: Es scheint, dass viele Leute meinen Artikel missverstanden haben:
Auf keinen Fall möchte ich C / C ++ kritisieren und auf dem Rast schreiben sagen.
Ich weise nur auf die Mängel von C / C ++ hin, weil sie ein bisschen davon haben.

Alles hat seine Nachteile, ich habe nur meine Gedanken geteilt.
UPD2:

In den Kommentaren schreiben viele, dass die Wespen so arbeiten und im Allgemeinen sind dies die Merkmale. Ihr seid falsch.
Der gleiche Beweis wächst, dass Sie eine Systemprogrammiersprache erstellen können, in der es nicht so einfach ist, sich in den Fuß zu schießen.

Es ist nur so, dass C / C ++ voll von Lösungen ist, die niemand reparieren kann, da dies die Abwärtskompatibilität beeinträchtigen kann.

Und ja, das ist meine Meinung, es ist subjektiv .

Wenn Sie nicht einverstanden sind - besser kommentieren, als dumm minus, weil die Meinung von uns allen
subjektiv.

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


All Articles