なぜ誰かがC ++ではなくCを使用するのですか?[閉まっている]


132

人々はC ++について文句言うのが好きなようですが、なぜC ++ではなくCを選択するのかについて、多くの証拠を見つけることができませんでした。Cはほぼ同じように不安定にならず、C ++にこれらすべての問題がある場合、なぜCサブセットに制限できないのでしょうか。あなたの考え/経験は何ですか?


完全に重複したリンクは機能しなくなります...... cパーティーに遅れている男と言います:)
kyle

4
CはC ++よりも優れていてシンプルですが、どのCプログラマでもC ++をCに変換して笑うことができます。
BobRun

11
恐ろしいことは、一般的に人々が「++」は本当にこれが本当にうーんという意味だと思うことです。
BobRun

明白な-小さい/組み込みデバイス-を除いて、一般にCは、OOP機能が肥大化している純粋な数値処理問題(GPUグラフィック処理、超並列物理演算、パターンマイニングなど)に適しています。C ++は、「もの」が相互作用するシステムのモデリングに適しています。OOP機能を使用すると、はるかに簡単になります。
ペースマン、

3
JavaScript、ベストプラクティス、c ++、およびOOPは、おそらく実際には存在しないか、解決する必要のないこれらの抽象的な問題を解決しようとするのが愚かであり、忙しすぎるためです。
マーシャルクラフト

回答:


132

ジョエルの答えは、あなたがかもしれない理由のために良いです持っているいくつかの他の人がありますが、Cを使用します:

  • Cでの検証とテストが容易な業界ガイドラインを満たしている必要があります。
  • C ++ではなくCで動作するツールがあります(コンパイラだけでなく、すべてのサポートツール、カバレッジ、分析などについて考えてください)
  • あなたのターゲット開発者はCの達人です
  • ドライバー、カーネル、またはその他の低レベルのコードを書いている
  • C ++コンパイラは、記述する必要のある種類のコードを最適化するのが得意ではありません。
  • あなたのアプリはオブジェクト指向に向いているだけでなく、その形式で書くのが難しいでしょう

いくつかのケースでは、しかし、あなたは可能性がしたいですというC ++よりもCを使用します:

  • アセンブラーでコーディングする手間をかけずにアセンブラーのパフォーマンスを望んでいる場合(C ++は理論的には「完璧な」パフォーマンスが可能ですが、コンパイラーは最適化を見るのが得意ではありません)
  • あなたが書いているソフトウェアはささいなものか、それとほぼ同じです-小さなCコンパイラを取り出し、数行のコードを書いてコンパイルすれば、準備は完了です-ヘルパーで巨大なエディタを開く必要はなく、実際に書く必要もありません空で役に立たないクラス、名前空間の扱いなど。C++コンパイラでもほぼ同じことができ、単純にCサブセットを使用できますが、小さなプログラムの場合でもC ++コンパイラは遅くなります。
  • 極端なパフォーマンスまたは小さなコードサイズが必要であり、ライブラリのサイズとパフォーマンスが原因で、C ++コンパイラーが実際に実行を困難にすることを知っている

Cサブセットを使用してC ++コンパイラーでコンパイルするだけでよいと主張しますが、そのようにすると、コンパイラーによってわずかに異なる結果が得られることがわかります。

とにかく、あなたがそうしているなら、あなたはCを使っています。あなたの質問は本当に「なぜCプログラマはC ++コンパイラを使わないのですか?」もしそうなら、言語の違いを理解していないか、コンパイラの理論を理解していません。


2
MISRA C標準もありますが、AFAIKはまだC ++に対して安定していません。
ポールネイサン

60
パフォーマンスの部分は必ずしも真実ではありません。C ++がCよりもはるかに最適化できる領域はたくさんあります(もちろん、その逆も時々当てはまりますが、一般に、パフォーマンス上の理由からC ++よりもCを選択することは悪い考えです)。
2009年

9
もっとパフォーマンス情報に興味があります。Cが「たまに」しか実行しない理由がわかりません。平均的なプログラマを考えると、C ++はパフォーマンスの達成を容易にします(パターンの適切な使用)かもしれませんが、エキスパートによって作成されたCプログラムはより高速でなければなりません-オーバーヘッドが低くなります。
アダムデイビス

3
もちろん、高速のCプログラムは書き込みとデバッグに時間がかかるため、トレードオフがあり、マシンの速度を考えると、トレードオフが特別なアプリケーションを除いてほとんど価値がないため、C ++が一般的に優れています。(コードが完了するまでに、コンピュータはより高速になり、difを食べます)
アダムデイビス

21
@Adam:C ++は、「かなり」のコードでCよりもパフォーマンスが優れています。C ++では、Cがマクロを必要とする場所でテンプレートとインライン関数を使用できます。C ++オーバーヘッドは要求されたときにのみ表示され、それ以外はCと同じです(仮想、try / throw、dynamic_cast)。オーバーヘッドの多くは、プログラムのイメージサイズでのみ表示されます。
Zan Lynx、

88

私はミニマリズムとシンプルさが好きです。


9
OK-十分公正です...それで、なぜフォースではないのですか?
ジョナサンレフラー、

14
私は彼が図書館、本、フォーラムを利用できるようにすることも好きだと思いますか?
gnud

30
私はあなたの答えのミニマリズムとシンプルさが好きです... :)
Joe DF

8
同意します。Cは非常に単純で「小さい」。Cは常に同じように見え、プロジェクトの新しい寄稿者であれば、それがどのように機能するかを理解するのは簡単です。c ++には多くの役に立たないことがたくさんあり、c ++プロジェクトを見るとすぐに混乱します。私はc ++の人々(OO機能を備えたC言語)を理解できますが、Cの方が単純で簡単です。
user69969 2014年

1
また、Cは、小さなユニバーサルライブラリ、スクリプト言語、レンダリングエンジンなど、ある種のライブラリを記述するのに非常に適した言語だと思います。
keebus 2016年

65
  • 彼らはすでにCを知っているので
  • Cコンパイラのみを備えたプラットフォーム向けの組み込みアプリを構築しているため
  • Cで書かれたレガシーソフトウェアを維持しているため
  • オペレーティングシステム、リレーショナルデータベースエンジン、または小売3Dビデオゲームエンジンのレベルで何かを書いています。

4
一部のマイクロコントローラーには、本当に面倒なCコンパイラしかありません。基本的なC ++機能(名前空間、仮想関数以外のクラス、列挙型、ブロックのトップ以外の場所で変数を宣言する)は、最も価値のあるIMHOです。
Jason S

2
これから、妥当な代替手段がない場合にのみCを選択するように聞こえます。

2
@ジョー:最初の点は別として、それはそれについて要約します。後期の言語の多くはCを採用し、「ねえ、もっと上手くできるよ」と言った。
Joel Coehoorn、2009年

1
同意した。洗練されたC ++機能を使用していない場合は、C ++が単調に優れたCであると思います。より洗練されたC ++機能を使用すると、議論の余地が出てきますが、通常は、Javaなどの抽象化のレベルが高くなります。
ポールネイサン

4
ほとんどの3Dゲームエンジンは、実際にはC ++を使用しています。UE4は主にC ++を使用します。
Aditya Kashi

56

パフォーマンスへの恐怖や肥大化は、C ++をやめる理由にはなりません。すべての言語には潜在的な落とし穴とトレードオフがあります-優れたプログラマーはこれらについて学び、必要に応じて対処戦略を開発すると、貧しいプログラマーは言語に反して責任を負いません。

解釈されたPythonは多くの点で「遅い」言語と見なされていますが、重要なタスクの場合、熟練したPythonプログラマは、経験の浅いC開発者よりも速く実行されるコードを簡単に作成できます。

私の業界、ビデオゲームでは、RTTI、例外、または内部ループの仮想関数などを回避することにより、C ++で高性能コードを記述しています。これらは非常に便利ですが、パフォーマンスまたは膨らみの問題があり、避けることが望ましいです。さらに一歩進んで完全にCに切り替えると、C ++のほとんどの有用な構成要素がほとんど得られなくなります。

Cを選択する最大の実用的な理由は、サポートがC ++よりも広く普及していることです。C ++コンパイラさえ備えていない多くのプラットフォーム、特に組み込みのプラットフォームがあります。

ベンダー間の互換性の問題もあります。Cには安定した明確に定義されたABI(アプリケーションバイナリインターフェイス)がありますが、C ++にはありません。C ++のABIは、vtablesやコンストラクター/デストラクターなどの理由により、より複雑であるため、ベンダーごとに、またベンダーツールチェーンのバージョンによっても、異なる方法で実装されています。

つまり、あるコンパイラーで生成されたライブラリーを別のコンパイラーのコードまたはライブラリーとリンクして、分散プロジェクトまたはバイナリー・ライブラリーのミドルウェア・プロバイダーに悪夢をもたらすことはできません。


7
「解釈されたPythonは多くの点で「遅い」言語と見なされていますが、重要なタスクの場合、熟練したPythonプログラマは、経験の浅いC開発者よりも速く実行されるコードを簡単に作成できます。」アルゴリズムのレッスンを受けたプログラマー(Pythonプログラマーである必要はない)は、経験の浅い開発者(一般)よりも速く実行されるコードを生成できると思います。
Andrei Ciobanu

15
そして、同じ経験の浅いc devは、彼のcコードよりも遅いpythonコードを生成します。Pythonはcよりもはるかに遅いです。
ミリースミス

37

小さくてタイトな言語での作業を楽しんでいるので、Cで書くことにしました。私は、妥当な時間内に読むことができる標準へのアクセスが好きです(私にとっては、私は非常に遅いリーダーです)。さらに、(一部の PICマイクロコントローラーのように)望ましいC ++コンパイラーがほとんどない組み込みシステム用のソフトウェアを作成するために使用します。


re:PIC-あなたの痛みを感じます。多くのPICコードを実行する必要がある場合は、おそらくC ++をサポートするIARコンパイラを使用します。私はMSP430でそれを使用しました、そしてそれはかなりいいです。
Jason S

1
Cの大幅に改善されたコンパイル時間を忘れないでください。テンプレートシステムはありません。
エンジニア、

35

私は別の見方をします:なぜCの代わりにC ++を使うのですか?

「Cプログラミング言語(別名:K&R)」は、300ページ未満で言語が実行できるすべてのことを行う方法を明確に説明しています。ミニマリズムの傑作です。C ++の本も近づきません。

明らかな反論は、現代の言語のすべてではないにしても、ほとんどの場合同じことが言えます-彼らはまた、数百ページですべてを行う方法をあなたに教えることができないということです。そうだね。では、なぜ代わりにC ++を使用するのでしょうか。機能の豊富さ?力?より機能豊富な機能や強力な機能が必要な場合は、C#、Objective C、Javaなどを使用してください。C ++の複雑さを自分で負担するのはなぜですか?C ++が付与する制御の程度が必要な場合は、Cを使用することを主張します。Cは何でも実行でき、うまく実行できます。


同意する。私はパワーが欲しいので、1/2ウェイポイントではなく、本当に強力なものを使用します。
ダイナ

7
@Dinah:1/2ウェイポイントは、C#またはJavaのパフォーマンスとメモリコストなしで、より高いレベルの表現力を提供します。
Zan Lynx、

5
@ザンリンクス:あなたは正しいです。しかし、私が元の投稿で私がした反対の立場をとることによって、C ++に対するCの実行可能性について指摘したことを願っています。
ダイナ

28

すでに述べた他のいくつかの点に加えて:

驚きが少ない

つまり、コードの一部が正確に何を行うかを確認する方がはるかに簡単です。です。C ++では、コンパイラーが生成するコードを正確に知ることができるように、達人レベルに近づく必要があります(テンプレート、複数の継承、自動生成されたコンストラクター、仮想関数の組み合わせを試して、名前空間の魔法と引数に依存するルックアップを混ぜてください)。

多くの場合、この魔法は素晴らしいですが、たとえばリアルタイムシステムでは、1日が本当に失敗する可能性があります。


27

Linusの質問に対する答えは、「C ++は恐ろしい言語だから」です。

彼の証拠はせいぜい逸話ですが、彼はポイントを持っています。

低レベル言語の方がいいので、C ++よりも好みます。C++は、追加機能のライブラリとコンパイラサポートが追加されたCです(両方の言語には他の言語にはない機能があり、実装方法が異なります)。 Cでの時間と経験、追加された低レベルの関連パワーの恩恵を受けることができます... [編集済み]慣れているため)言語/コンパイラ自体から得られるいくつかのパワーの恩恵を受けるのではなく、手動でより多くの作業を行うている)

リンクを追加する:

なぜC ++ for embeddedなのか

なぜまだCを使用しているのですか?PDF

私は考えグーグル論評の多くは、すでにウェブ上があるので。これのために


17
私はCで多くのコーディングを行った後、C ++で少しの間、VBで非常に長い時間を費やしましたが、今では過去数年間C#を使用しています。それ以来、少しCとC ++のコードを書いてきましたが、Cは明確でタイトで、C#はクールで強力で、C ++は非常に優れていることに気づきました。
CMPalmer 2009年

25
Linusは、C ++のメリットについて話す資格がありません。彼がある種の神託であるかのように彼を引用するのは、ただ愚かです。そして、「物事を難しい方法で行う」ことについての少しは意味がありません。Cを使用する正当な理由はありますが、「それはより多くの仕事です」、または「Linusはそう言った」それらの中にありません。
jalf

8
@ jalf、Linusをある種のオラクルであるかのように引用していません。世界で最も使用されているプログラムの1つであるLinuxカーネルでの選択について、よく知られたプログラマーの意見を述べるのは良いことです。質問は、私が答えようとした目的である意見(誰かがCを選ぶ理由)を求めます。
リック東京、

6
LinusはC ++を使用しておらず、私の知る限りでは、1990年に1度だけC ++を試しただけなので、C ++に関する意見の悪い情報源です。
Zan Lynx、

3
@Zan Linusは、他の場所でより多くのセルフコントロールを表示しました:「C ++とそれがもたらす追加機能を使用したかったのですが、C ++のどこで悪いコードがCよりもわかりにくいのです」。私の回答の引用は、「リーダーに従う」ではなく、意見の記録です。
リック東京、

26

プラグインを作成していて、C ++には標準のABIがないためです。


9
Cリンケージを使用して必要な関数をエクスポートし、実装をC ++に維持できるため、Cに固執するのは本当の理由ではありません。
codelogic 2009年

2
@codelogic-C ++プロジェクトは、同等のCプロジェクトよりも多くの型と関数をエクスポートする傾向があります。最終的な共有ライブラリでこれを非表示にすることは可能ですが、それは価値があるよりもかなり多くの努力です。
トム

tbhは本当に良い答えではありませんが、+ 1はC ++に標準のABIがないためです(はい.. C ++は
最悪

6
Cにも標準のABIはありません。
スティーブンキャノン

25

コンパイル時間が長いと面倒です。C ++を使用すると、コンパイル時間が非常に長くなる可能性があります(つまり、当然、スタックオーバーフローの時間が長くなります!)。


なぜこれが投票されたのですか?私自身はC ++で多くの作業を行っており、Cに戻ることはありませんが、実際にコンパイル時間が非常に長くなる可能性があります(たとえば、テンプレートについて考えてみてください)。
フランク

6
実際の作業にはC ++を使用していますが、コンパイル時間はほぼ瞬時であるため、常にCでプロトタイプを作成します。
トム

うーん、正しい方法で行われた場合、つまり肥大化していないwe-may-need-these-#includesとnot-sure-which-is-the-right-include-so-i-will-include-them-all-#コンパイル時間が含まれています。1つまたは3つのファイルをハックすると、100個のKLOCプロジェクトをコンパイルするのに1〜2秒しかかかりません。
セバスチャンマッハ

4
@トム:Cでプロトタイプを作成できる場合、C ++が実際にどのように見えるか疑問に思います。C++の機能を使用していませんか?詳しく説明できますか?
セバスチャンマッハ

24

私のプロジェクトではC ++を使用しています。それから私はプレーンなCが使われている仕事を得ました(20年前に開発されたAVソフトウェアのコードベースで、ドキュメントが不十分です...)。

私がCで好きな3つのことは:

  • 暗黙的なものは何もありません。プログラムが正確に何を行うか、何を行わないかがわかります。これにより、デバッグが容易になります。

  • 名前空間とオーバーロードの欠如は利点になる可能性があります。特定の関数が呼び出される場所を知りたい場合は、ソースコードディレクトリをgrepするだけでわかります。他の特別なツールは必要ありません。

  • 関数ポインタの力を再発見しました。基本的に、C ++で行うすべてのポリモーフィックなことを実行できますが、さらに柔軟性があります。


8
+1ただし、Cでのこのような多態性は、通常void *を介して取得されます。これは、何か厄介なことを行っているかどうかをチェックするコンパイラの機能を無効にするため危険です。
gd1 2013

4
@ gd1実際には、これvoid*が問題を引き起こした1つのケースを思い出せません。ミスから保護するための防御的なプログラミング手法は数多くあります。アサートをどこにでも配置し、マジックナンバーを構造体に(デバッグビルドで)追加するなどです。しかし、今日では、valgrind、drがあります。メモリ、およびMSVCでさえコードを計測して問題を検出するため、メモリ破損の問題を簡単に解決できます。
Calmarius

4
プログラムでメモリ破損が発生することはほとんどありませんが、可能であれば、プログラムを実行する前にエラーを検出することをお勧めします。キャストvoid*には、whatever*コンパイラは誠実に受け入れるものです。私は自分のコンパイラーが私を信頼しないことを望み、堅牢な型チェックを実施する可能性があります。C ++コンパイラによって発行されたテンプレート置換エラーは読むのが面倒ですが、少なくともガベージはコンパイルされません。
gd1 2013

1
@ gd1最初のコメントに戻りますが、手続き型のテクニックについてどの程度の経験がありますか(ほとんどの場合、OOタグでアクティブです)。void*通常避けることができます。カスタム動作を追加するときの一般的なパターンは、関数ポインターとvoid*ユーザーデータのを渡すことです。一般的なインターフェイスは通常、次のようになります。次に、ライブラリはこれをvoid*他の何もせずにコールバックに返します。ほとんどの場合、余分なデータがないため、NULLを渡し、コールバックのユーザーパラメータを無視します。あなたはこれを知っていたと思います。
Calmarius

@Calmarius「ほとんどの場合、追加のデータはありません」->これは、実際にはポリモーフィズムの利点です。voidポインターを使用せずに、余分なデータをバインドするのは簡単です。したがって、あなたの言い訳は基本的に「私はとにかくその機能を実際に使用しない」です。
user2445507 2018

15

誰も言及していないライブラリに驚いています。多くの言語がCライブラリにリンクし、C関数(extern "C"を含むC ++を含む)を呼び出すことができます。C ++は、C ++ lib( 'CにはないC ++の機能を使用するlibとして定義された[オーバーロードされた関数、仮想メソッド、オーバーロードされた演算子など...]を使用してエクスポートできない唯一のものextern "C"を介したC互換インターフェースを介したすべてのもの)。


1
そうではありません。関数をextern "C"または__cdeclして関数をCに公開することができます
。– Crashworks

すばらしいですが、他のどの言語で動作しますか?
BigSandwich、2009年

2
C libははるかに多くの場所で機能します。
BigSandwich 2009年

1
Cにリンクできるすべてのもの
Crashworks

2
相互運用性の問題の最も明白な理由は名前のマングリングであり、私はそれを持ち出す価値があると思います。
トム


12

C ++には同等の機能がないC99の機能を使用したいからです。


ただし、C ++に役立つC99機能は、一見したところほど多くはありません。可変長配列?C ++にはstd :: vectorsがあります。複素数/虚数のサポート?C ++には、テンプレート化された複合型があります。タイプジェネリック数学関数?C ++は標準の数学関数をオーバーロードし、同じ結果を引き起こしました。

名前付き初期化子?C ++ではありませんが、回避策があります。

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) { }
    ...
};

これにより、次のような記述が可能になります。

My_class mc(My_class_params().set_i(5).set_name("Me"));

聞いて聞いて!C ++には名前付きの指定された初期化子がないため、使用する必要があるたびに壁を押し上げます。
ephemient

2
イニシャライザは100%です。
Maygarden裁判官、2009年

関数の外でグローバル構造を初期化したい場合(したがって、.set _ *()は使用できません)、C ++は名前のない初期化構文を使用するか、構造体のコンストラクターを作成するように強制します。どちらのオプションも好きではありません。
ephemient 2009

C99(GCC)には、よりもはるかに使いやすいVLAもありますstd:vector
Vahid Amiri

10

なぜなら、多くのプログラミングタスクでは、Cはより単純で十分です。特に軽量ユーティリティをプログラミングしているとき、C ++は単にコードを書くのではなく、それ自体のためにエレガントなスーパーストラクチャーを構築することを望んでいるように感じるかもしれません。

OTOH、より複雑なプロジェクトでは、エレガンスにより、キーボードから自然に流れるよりもしっかりとした構造の厳密さが提供されます。


8

c ++の重要な機能のほとんどは、何らかの形でクラスまたはテンプレートに関係しています。これらは、コンパイラがこれらをオブジェクトコードに変換する方法を除いて、すばらしい機能です。ほとんどのコンパイラは名前のマングリングを使用しており、少なくとも面倒なことは何もしません。

多くのアプリケーションの場合のように、システムが単独で稼働している場合は、C ++が最適です。

システムがC ++で必ずしも書かれていないソフトウェア(最も頻繁にはアセンブラーまたはFortranライブラリー)と対話する必要がある場合は、窮地に陥っています。これらの種類のケースを操作するには、これらのシンボルの名前のマングリングを無効にする必要があります。これは通常、これらのオブジェクトを宣言することによって行われますextern "C"、、テンプレート、オーバーロードされた関数、またはクラスにすることはできません。それらがアプリケーションAPIである可能性が高い場合は、ヘルパー関数でラップし、それらの関数を実際の実装と同期させる必要があります。

そして実際には、C ++言語は、純粋なCで簡単に実装できる機能の標準構文を提供します。

つまり、相互運用可能なC ++のオーバーヘッドは高すぎるため、ほとんどの人が正当化できません。


3
Cまたは他のCLR言語から呼び出すことができるようにextern "C"インターフェイスを持つC ++で非常に多くの.DLLを作成したので、これを聞いて非常に驚いています。確かに、単純にメンバー関数ポインターを公開することはできませんが、__ cdecl呼び出しのデータをマーシャリングすることはそれほど問題にはなりません。
Crashworks、

1
実際には、テンプレート化されたコードをエクスポートできます。名前の衝突を回避するために、使用するすべての型にテンプレート化されていない関数ラッパーが必要です。
Maygarden裁判官、2009年

8

これはかなり浅いですが、忙しい学生としてC ++を学ぶのに時間がかかりすぎると思ったのでCを選びました。私の大学の多くの教授はPythonでの宿題を受け入れません。私は何かをすぐに取り上げる必要がありました。


8
先生の賢い!
Andrei Ciobanu

6

「使用したいC ++のサブセットを使用する」についての1つの注釈:このアイデアの問題は、プロジェクトの全員が同じサブセットを使用することを強制するためにコストがかかることです。私の意見では、これらのコストは疎結合プロジェクト(オープンソースプロジェクトなど)の場合は非常に高く、C ++はCを使用した場所ではどこでも使用できないという意味で、より優れたCになることに完全に失敗しました。


6

ああ、C対C ++、炎上戦争を始めるのに最適な方法です。:)

Cは、ドライバーと埋め込みコードに適していると思います。

C ++にはCにはない優れた機能がいくつかありますが、C ++のオブジェクト指向機能の多くは、裏で発生する明らかでない副作用を伴うコードを書くときに、途方もないコーディングの混乱を引き起こす可能性があります。クレイジーなコードは、コンストラクター、デストラクター、仮想関数などに隠すことができます。Cコードの美しさは、言語の背後で目立たないことを行わないため、コードを読み取ることができ、すべてのコンストラクターとデストラクターを調べる必要がありません。等々。問題の多くは、一部の人々による不適切なコーディング方法です。

私の完璧な言語は、C99と、バイナリ出力にゼロ(またはゼロに近い)コンパイラオーバーヘッドを追加する、より安全なC ++機能の最小限のサブセットの組み合わせです。完璧な追加は、データと関数のクラスのカプセル化と命名の概念です。


C +またはC100:_)と
名付けます

4

なぜC ++ではなくCを選択するのかについて、多くの証拠を見つけることができませんでした。

私が証拠について言おうとしていることをほとんど呼ぶことはできません。それは私の意見です。

Cは、文法家の心の中にうまく収まるので、Cが好きです。

C ++には多くの複雑なルールがあります[いつ仮想デストラクタが必要なのか、いつコンストラクタで仮想メソッドを呼び出すことができるのか、どのようにオーバーロードとオーバーライドが相互作用するのか...]。それらすべてを習得するには多くの労力がかかります。また、参照、演算子のオーバーロード、関数のオーバーロードの間で、コードの一部を理解するには、見つけるのが簡単な場合とそうでない場合がある他のコードを理解する必要があります。

組織がC ++よりもCを好む理由についての別の質問。私はそれを知りません、私はただの人々です;-)

C ++を守るために、それは価値ある機能を表にもたらします。しかし、私が最も重視するのは、おそらくparametric( 'ish)polymorphismです:1つ以上の型を引数としてとる操作と型。


2
++score「プログラマーの心の中にうまく収まるので、Cのような人は」というあなたの発言は、非常にうまく述べられたものです。見たものが得られるものであることがわかっている単純な言語でプログラミングできることは、プログラミング言語にとって本当に魅力的な特性です。
tchrist、

3

CはC ++よりも最適化と効率をよりよく制御できるため、メモリやその他のリソースが制限されていて、すべての最適化が役立つ状況で役立ちます。もちろん、設置面積も小さくなります。


これらの例を挙げられますか?
アンドリューグラント

したがって、Cコンパイラを使用してコンパイルした同じCコードは、C ++コンパイラを使用してコンパイルした場合よりも効率的でしょうか?
スティーブクオ

1
数年前、Linuxカーネルはgccまたはg ++でコンパイルできましたが、g ++はより遅いコードを作成しました(「ついに、Linusが開発カーネルを維持している間に...」のtux.org/lkml/#s15-3)。
Max Lybbert 2009年

C ++ではなくCでコードを最適化する方法をより多く制御できるようにするために、もっと考えていたと思います。アセンブリ言語を使用するプログラマーが、より高いレベルの言語を使用するプログラマーよりも自分のコードをより正確に微調整できる方法とよく似ています。
Chris

2

また、C ++の機能の一部をCのように使用し、問題のある機能は使用しないようにする方法もあります。たとえば、クラスとクラスメソッドおよび関数のオーバーロード(通常はCダイハードでも対処しやすい)を使用しますが、STL、ストリームオペレーター、およびBoost(学習が難しく、メモリの特性が悪い可能性があります)は使用しません。


1

リソースが限られているシステム(組み込みシステム、またはカーネルのような実際のベアメタルコードなど)を記述していて、オーバーヘッドをできるだけ少なくしたいからです。

ほとんどの組み込みシステムにC ++コンパイラがない理由はそこにあります。人々がそれを望まないということではありません。それは、C ++コードをその小さなスペースに詰め込むことが、不可能に近づくタスクだからです。


3
言語としてのC ++自体の問題はそれほど多くありませんが、無差別にテンプレートを使用することで引き起こされる病的な肥大化が引き起こす可能性があります。
Crashworks、

1
ecosは主にC ++で書かれています。言語(Cと比較)と実行可能サイズ(使用する機能がわかっている限り)の間には関係がありません。
user52875 2009年

1
「使用する機能を知っている限り」。それがポイントです-「まあ、私たちはC ++を持っていますが、オーバーヘッドの理由で言語機能の半分をサポートできない」という結果はSymbian / C ++であり、Cプログラマ C ++プログラマの両方を混乱させ、怒らせます...
Steve Jessop

1
すべての点で合意。「使用する機能を知る」ための私たちの解決策は、Cコンパイラを使用してそれを1日と呼ぶことでした。確かに、C ++を機能させることもできましたが(これはちょっとしたオタクとしてはとても楽しいものでした)、出荷する製品があり、それを心配する時間はありませんでした。
Electrons_Ahoy

1

Cに必要なのは、より優れたプリプロセッサでした。cfrontは1つだったので、生まれたc ++

私はCを使用しますが、「プリプロセッサとしてのc ++」は問題です。

きっとよく書かれたc ++ライブラリ/フレームワーク/ツールキットの一番下に、dirty-old-c(または静的キャスト、同じです)があります。


0
  • 数年前まで、既存のC ++コンパイラには重要な機能が欠けていたか、サポートが不十分であり、サポートされている機能がそれらの間で大幅に異なっていたため、移植可能なアプリケーションを書くのは困難でした。
  • シンボルの標準的な命名がないため、他の言語/アプリケーションがC ++クラスを直接サポートすることは困難です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.