私がCとC ++で嫌いなもの

プロのC / C ++プログラマーには読まないでください)。



記事では、私の意見を表明しますが、同意できない場合はコメントで正当化してください。

この記事の目的:私が本当に嫌いなCおよびC ++の欠点を指摘し、新しいバージョンの言語を使用するか、標準を改善するためのアイデアを提供することをお勧めします。



さて、それはホリバーを再燃させる時です。



C ++にひどい行があることを知っていることは誰もが知っていると思います。 特に古い型について話している場合は、新しい文字列で多くの修正と改善が行われていますが、Unicodeのサポートはまだありません(!)。



C ++ 20標準では、Unicode文字列を入力するようなものです。



C ++ 20! そして、これは1983年以来 C ++が存在したという事実にもかかわらずです。



お気に入りのIDEを開き、次のコードをコンパイルしてください。



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





UPD1:コメンテーターは、krakozyabryはWindowsのみであると言います。 確かに、それについて書くのを忘れていました。

しかし、まだ不快です。



GCCコンパイラーであるDev Cppでコンパイルしました。



コンパイルして確認してください:







良い画面出力ですか?



それでは、char string [256]をchar * stringに置き換えましょう。



私はこれがうまくいくと言っているわけではありませんが、コンパイラは可能な限り高いエラーを投げるべきでした。



ハングする作業プログラムがありました。

コンパイラーがエラーをスローした方が良いでしょう。

そして、全体はコンパイラーがそれをコンパイルしただけでなく、まだ

警告を発行しました。



別のジョークがあります:



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





何を期待しますか? コンパイラは、要素が100個しかないため、配列の101個の要素にアクセスできないことを示しますが、コンパイル、実行、および参照... 32765(少なくとも私のハードウェアでは)。



うーん。



次に、このコードをテストしましょう。



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





彼は何をもたらすと思いますか?



正解はコンパイラーに依存します。



GCCでは、これは14になりますが、最適化フラグによって異なります。



そして、別のコンパイラーでは簡単に12になります



私は誰もがCとプラスには構文糖の束があることを知っていると思いますが、それは常に必要とはほど遠いです。



たとえば、 std::cout<<4["string"];



これは有効なコードです

std::cout<<"string"[4];



ように、nを出力しstd::cout<<"string"[4];







すごいね



そして今、患者について。

C ++およびネットワーク。

これらは、非常によく一致しない2つの概念です。

標準のC ++ライブラリを使用して、お気に入りのサイトから猫の画像をダウンロードするだけです。

これは、C ++ 17標準が採用されるまでは不可能でした。

同じ標準ライブラリでJSONを使用することはできません。

これに関する素晴らしいコメント。

一般に、C ++でJSONを操作することは悪夢に似ています。

出所

条件は常に偽だと思いますか?



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





いいえ、あなたは間違っています。



C ++プロジェクトとしてコンパイルする場合、ほとんどの場合、条件は満たされていません。

すべきではない[1]

そして、Cプロジェクトのようであれば、この場合、sizeof( 'a')== sizeof(int)です。

これらは物です。

[1]一般に、多くの異なるCおよびC ++コンパイラも問題です。

多くのソリューションは標準化されておらず、特定のコンパイラでのみ機能するためです。



たとえば、C ++の128ビット数。 gccとclangには__int128型がありますが、標準ではないためVisual Studioにはありません。 または、たとえば、Visual Studioの文字列。



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





または、たとえば、老人のBorland C ++ Builderでは、Object Pascalで記述されたコードを作成できます。

そして、そのような瞬間がたくさんあります。



特に痛いのは、CおよびC ++パッケージのリストがないことです。



これから何が続きますか? C ++ 17などの新しいバージョンのC ++を使用すると、いくつかの問題が解決されます。



最も近い競合C ++では、このリストにある問題のほとんどはありません。たとえば、すばらしい貨物がありますが、もちろん不完全です。



また、CおよびC ++のどのような問題を知っていますか?

コメントを書いてください。



UPD:多くの人が私の記事を誤解しているようです:

決してC / C ++を批判し、急いで書きたいとは思いません。

C / C ++の短所を指摘しただけです。なぜなら、彼らはそれを少し得たからです。


すべてに欠点があります。私は自分の考えを共有しました。

UPD2:



コメントでは、多くの人がこれがスズメバチの仕組みであり、一般にこれらが機能であると書いています。 あなたたちは間違っています。

同じような証拠が増えており、システムプログラミング言語を作成して、自分自身を簡単に撃つことはできません。



C / C ++は、下位互換性を破ることができるため、誰も修正できないソリューションのレガシーでいっぱいです。



そして、はい、これは私の意見です、それは主観的です。



あなたが同意しない場合-愚かなマイナスではなく、より良いコメント、私たち全員の意見

主観的に。



All Articles