web-dev-qa-db-ja.com

CはC ++よりも良い選択となるのはいつですか?

C++のOOP機能を使用しない理由があるとは想像できません。それはCと同じくらい高速で、私にとってより重要なのは、Cと同じように透過的です。 (私が知っている「透過的」、つまり私のソースがコンパイルされるものを意味します。あるいは、私は知っていると思います。)

CプログラミングでOOPの能力を使用しない理由はありますか?

組み込みシステムまたはその他の制限されたプラットフォームのみを例外として受け入れます。このようなメモリ管理は利用できず、C++で必要です。オペレーティングシステムの開発も承ります。または、プログラムはC++より前に作成を開始しました。さて、それだけです。

PDATE:質問は、C/C++対他の言語ではなく、C対C++に関するものです。私は「最終的なケース」でC/C++を使用しています。

7
ern0

C++を使用しない私のお気に入りの理由は、Cがほとんどのプラットフォームでde facto標準ABIを使用していることです。つまり、名前の変換などがないため、通常は2つの異なるCコンパイラでコンパイルされたコードをリンクできます。 C++では、必要になるので幸運を祈ります。

14
dsimcha

ケース:

  1. OOP-パラダイムであり、ドグマではありません。
  2. コンパイル時間が長い可能性のある小さな(行単位の)アプリケーションを書く必要があります。
  3. C++の一部の機能が気に入らない/必要としない。

結局のところ、これらは2つの異なる言語であり、構文はほとんど共有されています。あなたはあなたのニーズ/味によりよく合うものを選んだだけです。

8
cbrandolino

私が以前の雇用主から与えられた正当な理由:

あなたはOOPを学ばなかったエンジニアと協力し、マネージャーは彼らがあなたのコードを理解する必要がないことを望んでいます。

7
mootinator

短い答え:使用するC++の機能、およびコンパイラーがそれらを使用できるようにしたかどうかによって異なります。

上記の例をサポートする具体的な例:C++での例外処理:try、throw、catchステートメントを使用。一部のコンパイラには、例外処理のサポートを有効または無効にするコマンドラインオプションがあります。つまり、try throw catchを含むコードはコンパイルされます。例外処理のサポートを有効にすると、それを使用しなくても、コンパイルされたバイナリのサイズが、オフになっている場合と比較して最大3分の1増加する可能性があります。したがって、プログラムを保持するためのメモリが不足していて、例外処理を使用しないか、エラーを報告する別の方法を見つけることができる場合は、コンパイラでこれをオフにします。

あなたの質問は特に、リソース(CPU時間とRAMがない)が埋め込まれたリアルタイムシステム(例:家電、制御システム)および半埋め込み(つまり、キオスク、携帯電話、ゲームコンソール)に当てはまります。デスクトップと同じように豊富です。しかし、ソフトウェアスタックの一部がC++で記述された2つの組み込みリアルタイムプロジェクトに取り組みました。1つは光学ドライブファームウェア(DVD/CDバーナー)で、もう1つは光ファイバーマルチプレクサーコントロールでした。ソフトウェア。

@mootinatorに同意します。これは、他のチームメンバーがC++を使いこなす必要がある場合、プロジェクトの提供に影響を与える可能性があるため、作業相手に依存します。

C++は、C++が提供するオブジェクト指向プログラミングの概念を介して、再利用と保守性の利点をもたらします。

そのため、選択したフィールドでのC++のパフォーマンス(速度とメモリ)を注意深く調査することをお勧めします。この調査に従ってC++を引き続き使用できると確信できたら、プロジェクトを定期的に実装してテストし、プロジェクトのパフォーマンスのニーズが満たされていることを確認して、予期しないことがないようにします。

5
therobyouknow

答えは、CまたはC++を使用する予定のチームとプロジェクトによって異なります。

ここ は、プレーンCとC++の利点の良いレビューがあると思います。著者は組み込み開発者の観点から議論しますが、パフォーマンス、保守性、透過性の点でC++がCに勝っている実際的なケースを示しています。同じ作者が C++ FQA の作者です。C++bashingのコレクションですが、それでもかなり有益です。 C++愛好家のために。

考慮すべきもう1つの側面は、C++の典型的なイディオムです。それらのいくつかは実際には一般的にOOPに関連していませんが、厄介です。

その例は、値を返さないがパラメーターの受け渡しと初期化リストを可能にするコンストラクターです。上記の著者は、コンストラクターと初期化リストは解決すべき問題よりも多くの問題を引き起こすと主張しており、多くのコーディングガイドラインでは、多くのパラメーターを持つ複雑なコンストラクターを使用せず、デフォルトだけでもより単純なコンストラクターを使用することをお勧めしますコンストラクター、および適切な初期化ルーチンをユーザーに提供します。これは、たとえば、Ada95以降で採用されているアプローチで、オブジェクトには、C++のデフォルトコンストラクターと同様に、引数のないコンストラクターのみが存在する場合です。

2
Andrea

もちろん、C++は悪ではありません(虐待を招くのを見てきましたが)。ただし、Cにこだわる場合があります。

C++コンパイラは名前をマングルし、メモリ管理、シリアルI/O、クラスライブラリなどの多くのライブラリサポートを持つ傾向があります。私がそれらを必要とするなら、それらすべてのものは価値があります。時々私はそれをすべて欲しがらず、「金属」に近いものを好みます。

2
Mike Dunlavey