2011-01-01 8 views
10

CとC++は異なる言語ですが、私たちはそれを知っています。なぜC++はCと下位互換性がありますか?なぜ "純粋な" C++言語がないのですか?

しかし、これらの言語が異なる場合、mallocや無料のような関数を使用するのはなぜ可能ですか?私はC言語のためにC++が持っているほこりのようなものがすべてあると確信していますが、C++は別の言語なので、これらのものを削除して、

プログラマーがOOモデルなしで作業できるようにするのか、または一部のコンパイラがC++の高水準抽象機能をサポートしていないためですか?

+5

少しC++歴:http://www.hitmill.com/programming/cpp/cppHistory.html – miku

答えて

15

「純粋な」C++言語がないのはなぜですか?少なくとも1つあります。最も一般的なものはDと呼ばれ、うまく設計されています。あなたは

。それにああをCライブラリを使用することができ、ほとんど誰もがそれを使用していません。:)

直接の理由は、C++は、人々に彼らの遺産のラインのポート数百万人に良い理由を与えるのに十分悪いわけではないということですあなたが記述したように、Dのような "純粋な"言語

+6

これは、CとC++の関係についての質問に答えず、代わりに別の言語をプラグインします。 –

+4

さて、私が直接関係する質問の第2の部分があります。 – Kos

+3

Dはおもしろいですが、私はそれを「純粋なC++」と呼んでいません。これは、同じ目標の多くで、従来のC手荷物のない別の言語です。 – dajames

22

C言語はC言語と互換性がない場合はすぐに死んでしまうので、ファンボーイを除いて、C++には互換性がないのであれば誰も望んでいません(私はおそらくこのために落とし込まれるでしょう。

+6

ない最初の場所で任意のファン達を持っているC++? – Kos

+3

@Kos:いいえ... ... –

+3

@Johannes:私は反対する必要があります。 JavaやC#のような言語は、C++のような直接的なC言語の互換性がなくても大丈夫です。 – Puppy

7

これは、Cコードを移植してC++コードとして直接コンパイルできるように設計されています。既存のコードを段階的にアップグレードするためのものです。 C++にmalloc/freeがなければ、既存のCコードをC++としてコンパイルすることはできませんでした。これは、mallocの呼び出しをすべて見つけて置き換えるために貧弱なshmuckを支払わなければならないためです。

+1

Nit picked:C++には 'malloc'と' free'がありません。*それらはC言語の標準ライブラリで言語キーワードではないので*サポートしています。しかしどちらの方法でも重要なポイントです。 – dmckee

3

C++の初期バージョンはCの上に構築されていました。実際、コンパイラはC++コードをCに変換して、ローカルCコンパイラによってコンパイルされました。 Bjarne Stroustrupは下位互換性を重視しており、機能を取り戻そうとする試みには抵抗します。

Bjarneの本The Design and Evolution of C++のすべてを読むことができます。

4

The Design & Evolution of C++をご覧になると、言語がその通りになった理由がわかります。 C++がCから成長し、それと下位互換性がある歴史的な理由があります。

5

C++はC言語と互換性があるように設計されていましたが、実際はC言語のスーパーセットでしたが、C言語はそれ以降に変更されています。

これは、Cランタイムライブラリを含むCライブラリがC++コードから呼び出せることを意味します。それはではないを意味するので、そうすることをお勧めします!

「純粋な」C++が必要な場合は、Cライブラリを呼び出すことなくC++を使用できます。

[他の人は私がこれを入力し始めてから言ったように:デザインC++の&進化は、この上の背景のための読書を開始するには良い場所です。]

+1

それはCの純粋なスーパーセットではなかったことに注意してください。 - キーワード、文字リテラルのサイズなどによって若干の違いがあります。 – me22

+0

文字のリテラルのサイズですか?それで何が変わったの? – Kos

+0

charはint型です。 'sizeof(char)'はcでは4、C++では1です。 – Tim

7

ほとんどのオペレーティングシステムは、CのAPIを公開するので、あなたの場合システムプログラミングのためにC++を使いたいなら、あるレベルのCの相互運用性が必要です。C標準ライブラリはC++標準ライブラリに組み込まれたこと

は歴史的、実際的な理由があります:C++はCの拡張としてその生活を始め、C標準ライブラリが使用する準備ができました。より多くの慣用的なC++の選択肢があるからといって、ライブラリの一部(mallocfreeなど)を除外することは愚かなことでしょう。あなたがばかげたことをしたいのであれば、C++はそうする権限を与えます。実際の言語のセマンティクスのために

、同じことが当てはまる - しかし、より少ない程度に - と理由は後方互換性の、C++はC遺産の完全に自由になることはありません。

1

さらに多くの純粋な言語がありました。彼らは、ほとんどのプログラマーの快適さの範囲をはるかに超えていたため、広く使われていませんでした。一方、C++では、プログラマはCスタイルを許可することによってゆっくりと立ち上がることができました。

C#やPythonのような言語を見て、なぜC++がそれらのように見えないのだろうと思っていますが、C++やJava、AwkやPerlのような踏み台が必要です。 C#はC-強化・バイ・SimulaののベルのバージョンのSunのため-馬鹿バージョンのMicrosoftのバージョンである:私は以前聞いた見積書を適応させること

1

すべてが正しいです。要約すると:理由は政治です。あなたが何か人気があることを望むなら、すでに人気のあるものを強化し、あなたはすぐに市場を持っています。何か新しいことをデザインし、あなたがサンでなければ誰も興味はありませんが、何かを完全にデザインして、数十億ドルを図書館の開発とマーケティングに投入しましょう。あなたはC++コードからC言語のライブラリに呼び出すことができるように

1

malloc()free()が必要とされています。 C言語ライブラリはmalloc()で割り当てられたメモリへのポインタを返します。このメモリは、呼び出し元によってfree()で解放されなければなりません。まれに、で割り当てられたメモリへのポインタを必要とする可能性があります。realloc()で内部的に再割り当てするか、free()で解放することができます。

関連する問題