C / C ++という用語の使用をやめるべきですか?


140

CとC ++は異なる言語であることは理解していますが、C ++を学習していたとき、CはC ++のサブセットであるか、C ++はクラスを持つCであると常に言われました。そして、C ++ x0、C ++ 11(または一般的な現代のC ++ 11/14/17)が登場するまで、それは非常に真実でした。実際(特に組み込みシステムで作業している場合)、C ++で記述されたコードを見つける可能性が非常に高くなりますが、多くの部分は完全に純粋なC言語で記述されています。ここにいくつかの質問があります:

  1. C / C ++という用語の使用をやめるべきですか?
  2. #1の答えが「はい」の場合、CとC ++を組み合わせて使用​​するプログラムをどのように呼び出すのでしょうか?
  3. それらの両方が「異なる」言語であることを考えると、C ++コンパイラがC言語で書かれたコードのサポートをやがて停止する可能性があります(現代のc ++はポインタ、動的メモリ処理などの基本的なもののためにCの考え方とは異なるため)
  4. 現在、互換性を維持するためにC / C ++の標準を作成している人々の間でコラボレーションはありますか
  5. #4が「はい」の場合、このようなコラボレーションは近い将来、現代のc ++(11/14/17)の登場で終わる可能性があります

私はすでに同様の質問があることを知っていますが、多くの人々がこれらの質問を共有していると確信していますので、特に近い将来のC ++の傾向に関係する点については良い答えを得ることに非常に興味があります。


35
そして、それはC ++ x0、C ++ 11の登場まで静かでした。いいえ、C89はC ++ 98のサブセットではありません。

35
Should I stop using the term C/C++。はい。これは、採用担当者と人事部門でのみ使用されます。エンジニアはこの用語を、CまたはC++独立した言語として使用します。用語を混ぜたエンジニアを見つけた場合は避けてください。
マーティンヨーク

8
@LokiAstari:本当ですか?SQLite開発者は人事を担当していると思います。なぜなら、彼らにはオープンなポジションがないからです。これは信じられないほど制限的な見方です(あなたの状況にある他の人が行ったように、私の答えに行って投票してください)。

4
@greyfade:誰でも、どこでも、よく見られる一連のキャラクターを主張できると考えるのは悪いことです。「C / C ++」は特定の言語に選択された名前かもしれませんが、それは「C / C ++」の使用がその言語を指すことを意味しません。 「C ++ 1z」は、ドラフトC ++標準に関するすべての議論が突然間違った用語を使用することになるでしょう。簡単に言えば、文字列「C / C ++」は「C / C ++」という名前のジョーク言語を参照したことはなく、参照することもありません。
ベンフォークト

32
@TomDworzanski、stroustrup.com/bs_faq.html# C-is -subset「厳密な数学的意味では、CはC ++のサブセットではありません...しかし、C ++はCがサポートするすべてのプログラミング手法をサポートしています...数時間で数万行のCをCスタイルのC ++に変換できることは珍しいため、C ++はANSI Cのスーパーセットであり、ANSI CはK&R Cのスーパーセットであり、ISO C ++はよく書かれたCは正当なC ++でもある傾向があります。たとえば、Kernighan&Ritchieのすべての例:「Cプログラミング言語(第2版)」もC ++プログラムです。
ベン

回答:


183

CはC ++のサブセットではありませんでした。これの最も明白な例はですint new;。これはC89とC ++ 98以来真実であり、新しい標準が発表されたため、言語はお互いからさらに成長しただけです。

C / C ++という用語の使用をやめるべきですか

はい

#1の答えが「はい」の場合、CとC ++を組み合わせて使用​​するプログラムをどのように呼び出すのでしょうか?

ソースファイルは、いずれかの言語で記述されています。プログラムは、一緒に動作する複数の言語のコード、または異なるコンパイル済みオブジェクトをリンクすることによって生成される実行可能ファイルで構成できます。プログラムはCとC ++で書かれていて、「C / C ++」は言語ではないと言うでしょう。

それらの両方が「異なる」言語であることを考えると、ある時点でC ++コンパイラがC言語で書かれたコードのサポートを停止する可能性があります

3)彼らは決してしなかった。char *a = malloc(10);CC ++は、少なくともISO標準がある限り、完全に互換性があることはありません(事前に標準化された日の詳細はわかりません)。リンクをクリックするか、C89以降では問題ないが、C ++標準では無効なファイルについては以下を参照してください。

4)わかりません、ワーキンググループはお互いを認識していますが、基準は彼ら自身にとって最良の決定を下します。

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

C Objective-Cのサブセットであることに言及する価値があるといつも思っています。


59
Objective-Cは、厳密なCのスーパーセットになるように特別に設計されており、競合する構文や完全に直交するオブジェクトシステムはありません。これは極端に行われているため、実際には「Objective-C」の「Objective」部分を他の言語にボルトで固定して、Objective-MODULA-2などを作成できます。そして最も有名なのは、完全に直交し、相互作用せず、統合されていない2つのオブジェクトシステムを備えたAppleのObjective-C ++ です。
ヨルグWミットタグ

20
@masonwheeler OPがCの実際のスーパーセットがどのように見えるかを見たい場合。
xhainingx

26
「ソースファイルは、いずれかの言語で記述されています。」標準C99とC ++ 89の両方としてきれいにコンパイルするプログラムにそれを教えてください。どちらの言語も他の言語のサブセットではありませんが、2つのセットの共通部分が広くターゲットになっています。ルアらを参照。
正式な

28
@munificent C ++コードを実行することjavacもできますが、それは何を意味するのでしょうか?
xhainingx

22
@munificent 3つの言語(C、/ bin / sh、f77)でコンパイルできるプログラムの例は、IOCCC 1986へのapplin.cエントリです。あなたの定義によると、タグC/Fortran/shは今では理にかなっていますか?! ioccc.org/years-spoiler.html#1986
シェード

108

これらの用語が頻繁に一致する理由がなければなりません。Cの先生に彼の言語がC ++のサブセットであることを伝えるべきではありませんが、ここにはいくつかの真実があります。他の人はすでに先生の視点を明らかにしています。これは非常に便利です(そして、例などで説明されています)。しかし、私たちは象牙の塔や本に住んでいません。

あなたの上司は、あなたが使用した正確な言語についてあまり気にすることができませんでした。彼がプログラミングについて少し知っているなら、C / C ++を使用したことを彼に伝えてください。それは「マシンコードにコンパイルする必要のある言語を使用し、DLLとすべての複雑なものを使用しました」のように聞こえます。これは「外部コミュニケーション」の部分です。

CとC ++の両方でインターフェイスできるライブラリを作成する場合は、C / C ++ライブラリと呼ぶことをお勧めします。もちろん、誰かが手を挙げて、なぜこれをC ++ラッパーを持つCライブラリと呼ばないのか尋ねます。とにかくC ++はCライブラリにリンクできるので、まったく言及する必要はありません。「はい、そうです、これはC / C ++ライブラリです」と答えるだけです。これは「内部コミュニケーション」の部分です。

C ++用の字句アナライザーを作成する場合、Cでどれだけうまく機能するかに驚くでしょう。すべてを変更する必要はないかもしれません。これが「アヒルなどのように見える場合」です。部。

等。

私が見たCプログラムの大部分は、C ++コードとして修正せずにコンパイル(および動作)します。いくつかの例外や独断的な(しかし影響力のある)プログラマーがあなたの直感をだまさないようにしてください。CとC ++は非常に近いものであり、互換性が非常に高いため、C / C ++という用語が使用されるほど頻繁に混在して一致します。JavaまたはPHPでない限り、CとC ++のどちらを検討するかは実際には関係ないこのような状況を説明するのに役立つため、これが使用されます。私たちはそれが「間違っている」ことを知っていますが、私たちは気にしません、それは間違っているよりも便利です。

それは悪用されるかもしれません、それは愚かかもしれませんが、それでも、必要以上につまらなくて、他の人が理解する用語でコミュニケーションを拒否することによってあなたがどんな利益を得るかはわかりません。特定の状況で不安を感じる場合は、単に一般的な用語C / C ++ではなく、ケースに関連する用語(CまたはC ++)を使用してください。

未来を恐れないでください。私たちのオペレーティングシステムはCで書かれています。現在のC / C ++ソフトウェアの生産の多くはC ++で行われています。このカップルはかなり長い間ここにいます。一方が他方とより互換性を持たないことに関心を持っている人はいません(実際、逆になります)。

ポイントについて具体的に言うには:

1)状況によります。はい、混乱を招く可能性があるとき、不安を感じるとき、または単に間違っているか文脈から外れているとき。あなたがそれが適切だと思うとき、いいえ。

2)該当なし

3)いいえと思いますが、水晶玉はありません。

4)わからない

5)私はそうは思わない


7
うるさくなったコメントは削除されました。
ChrisF

3
なぜこれに多くの賛成票があるのですか?それは不正確さと虚偽の主張でいっぱいです!
ザイビス

5
@Zaibisは、どのクレームが虚偽または不正確であるかを拡大するのに十分親切ですか?
ユーザー番号

3
ロジックに従って、C / C ++ / Objective-C / Fortran / Pascalは有効な式である必要がありますが、これはばかげています。C / C ++という用語の問題は、それがいくつかのことを意味する可能性があるため、目的の意味が満たされる保証がないことです。私の練習では、人々は通常、「CはC ++の古いプリミティブバージョンである」と理解しますが、これは間違っています。
-martinkunev

4
用語の本質的な妥当性を超えてC/C++、明確なものではないため、有用ではありません。あなたの例に従えば、a C/C++ libraryは、C ++ラッパーを備えたCライブラリ、またはCラッパーを備えたC ++ライブラリのいずれかを意味します。または、ライブラリが複数のモジュールで構成されていることを意味する場合があります。一部はC ++を使用してコンパイルされ、一部はCでコンパイルされます。これはまったく明確ではありません。私にとって、図書館が作られていると言うことC and C++は、はるかに明確であるかC library with compatibility with C++、より明確です。そして、ここでの曖昧さは、2つだけのlangであり、...もっとため、この「コミュニケーション戦略」を使用して想像
gaborous

43

流れに逆らって、それは文脈に依存すると言うでしょう。

「C / C ++」という用語は、「これはC / C ++プログラムです」などと言うときは通常適切ではありませんが、他の回答で詳しく調べられています。

ただし、C / C ++が適切なコンテキストが存在する場合があります。

  • 通常、C APIとC ++ APIの両方を備えたさまざまなライブラリがあります。このようなものをC / C ++ライブラリと呼ぶのは、それほど真実ではないでしょう。私たち人間は情報を圧縮するのが好きなので、「opencvはC / C ++ライブラリである」と短く、明確で理解しやすいと言ってください。
  • 言語の設計と構文について話すことができます。言語構文の観点からは、言語にはC / C ++のような構文があると言えます。
  • コーディングコンテストを開催し、CとC ++で記述されたソリューションの両方を受け入れます。
  • あなたは新しいプログラマーを雇っていて、ほとんどのタスクはCまたはC ++のいずれかであるため、プログラマーは両方の言語を知っている必要があります。組み込み開発では一般的で、Cは一部の(通常は非常に小さい)マイクロコントローラーに、C ++は他のマイクロコントローラーに適しています。この場合、C / C ++プログラマを探していると言うかもしれません。

10
このP.SOの一般的なコンセンサスに対する見解はここにあります。(「アジャイル/誇大広告/ The One And Unique Right Thing」のように見えるものすべてに賛成票を投じ、残りを支持する必要がある場合)は、いつものように歓迎されます。皆さん、プログラミングは宗教ではなく、このWebサイトは神聖な本ではありません。

16
最後の箇条書きは実際に大きな問題を示しています:(1)CまたはC ++を知っている人、(2)CとC ++の両方を知っている人、または(3)これらを聞いて混乱している人を探していますか?異なる言語。3番目のプールが大きくなるのを助けないでください。
5gon12eder

10
最後の箇条書きは、それが実際に探しているものである場合、「CおよびC ++の経験を持つプログラマー」としてより適切に表現されます。経験上、見出しリスト「C and C ++」または「C or C ++」が必要な「programmer」というタイトルの求人広告は、「programmer」というタイトルの広告とそれほど違いはなく、必要な資格として「C / C ++」をリストしていますが、ずっとより正確な。あなたがそのような仕事を探している人のタイプは、表現の正確さを本当に高く評価するかもしれません。
CVn

10
書かれた言語では、「/」は通常、論理的なものとしてではorなく、論理的なものとして解釈されxorます。したがって、どちらか一方または両方です。求人情報では、CまたはC ++、あるいはその両方を知っています。今、私は多くの人々がこの用語について宗教的であると感じています。優れた Cプログラマは、独立して、両方の言語がどのように異なるのC ++を拾って完全に罰金となります。PHPのコーディングを開始した後、Scala(完全に異なる2つの言語)に移行しました。CプログラマーがC ++を取得できないのはなぜですか?C / C ++の用語は、適切なコンテキスト内で使用される場合、ある程度のメリットがあります。
ILikeTacos

4
C / C ++を使用して、CまたはC ++としてコンパイルされた場合に動作するように意図されたプログラム、または別個のCおよびC ++コンポーネントを持つプログラムを記述することもできます。
イミビス

30

一般的に、SOユーザーは質問をしている人に言語を選択するよう依頼します:CまたはC ++。どうして?

CとC ++には多くの微妙な違いがあります。たとえば、C ++では、constグローバルスコープの変数は宣言されてexternいない限り内部リンケージを持ちますが、Cでは宣言されない限り外部リンケージを持ちstaticます。「C / C ++」と言うことで、OPは、CとC ++の両方の質問に対する答えが同じであるという知識を主張しています。これは不必要に、回答者になるのを難しくします。

  • コードが1つの言語または他の言語で有効ではない場合があります(たとえば、void*オブジェクトへのポインターからの暗黙的な変換はC ++では無効です)。これは面倒です。Cでは有効であるがC ++ではないコードを持っているのに、なぜ「C / C ++」と言っているのですか?あなたはCを意図しましたか、またはこれはC ++を意図したコードの単なるエラーですか?

  • 答えは言語によって異なる場合があります(たとえば、C99には可変長配列が存在しますが、C ++には存在しません)。あなたが話している言語がわからない場合は、実際にどちらの言語が使用されているかを知っているので、どちらか一方だけが実際に役立つ場合、両方の答えを推測する必要があります。あなたは私たちに言っていないだけです!

  • 答えは両方の言語で同じである場合もありますが、確認するのは難しいです。たとえば、CとC ++の整数変換規則は同じだと思いますが、本当に確実にするには、両方の標準を注意深く読む必要があります。繰り返しになりますが、これにより、おそらく言語の1つだけに関心がある場合、必要な作業の2倍の作業を行うことができます。

とにかく、他の質問に答えるには:

  1. はい。

  2. CコードとC ++コードをリンクする場合は、両方のタグを使用できますが、各ファイルの言語を指定してください。

  3. 時々、重大な変更がありますが、まれであり、通常は影響が限定されます(そうでない場合は承認されません)。たとえばauto、C ++ 11。

  4. 私は彼らが直接協力するとは思わないが、彼らは他の言語の開発に注意を払い、互換性をより困難にする変更の導入を避けようとする。

両方の言語について本当に知りたい場合は、それで問題ありません。質問でそれを言うことができます。あなたが「C / C ++」と言うとき、私はあなたが何を意味するのか本当に分かりません、そしてあなたは本当にあなたが2つの言語について仮定をしているように見えます。


7
私は、CとC ++の交点にコードを書き、型チェックにC ++コンパイラを使用し、コード生成にはCコンパイラを使用する人がいることを知っています。しかし、実際にそれが理にかなっているかどうかはわかりません。しかし、それは、Linux Kernelメーリングリストで数年ごとに出てくるトピックであり、誰かが(Linux KernelのUnified Object-Oriented Driver Modelで非常に重要な)名前を変更するパッチを提出すると、まさにそのstruct classようなstruct klass理由で、その後、Linusによって常に撃downされます。
ヨルグWミットタグ

3
@JörgWMittag:「C / C ++」を「CとC ++の共通サブセット」の略記として使用した人に会ったことはなく、彼が話していることも知っていました。共通のサブセットで意図的に作業している人は、省略しないことで明示的にする傾向があります。
バートヴァンインゲンシェナウ

2
これは、一般的にではなく、Stack Exchangeの質問でのC / C ++の使用に関する具体的な回答です。
イミビス

@BartvanIngenSchenau何人のstd委員会メンバーに会ったことがありますか?
curiousguy

18

CはC ++のサブセットであるか、C ++はクラスを持つCであると常に言われました。そして、C ++ x0、C ++ 11(または一般的な現代のC ++ 11/14/17)が登場するまで、それは静かでした。

CはC ++のサブセットではありませんでした。たとえば、C89はC ++ 98のサブセットではありません。

いくつかの例:

  • 関数パラメーター宣言のC89 識別子リスト形式は、C ++ではサポートされていません
  • C89とC ++ 98の文字定数には異なる型があります
  • C89とC ++ 98には、文字列リテラルの異なる型があります
  • 論理演算子は、C89とC ++ 98で異なる型を生成します(intvs bool
  1. C / C ++という用語の使用をやめるべきですか?

はい。

  1. #1の答えが「はい」の場合、CとC ++を組み合わせて使用​​するプログラムをどのように呼び出すのでしょうか?

プログラムはCまたはC ++です(非常に基本的なプログラムでさえCまたはC ++コンパイラでコンパイルできる場合)。コンパイルに使用しているコンパイラは何ですか?それはあなたの質問に答えるはずです。Harbison&Steeleは、CおよびC ++の共通サブセットを指定するためにClean Cという用語を作り出しましたが、それは悪い考えだと思います。

編集:しかし、技術的には単一のプログラムでCおよびC ++オブジェクトファイルをリンクできることを認めますが、OTHでは、JavaやC ++などの単一のプログラムで混合できる多くの言語があります。C / C ++プログラムという用語を使用すると、C / C ++と呼ばれる単一の言語で書かれているという混乱を増やすだけだと思います。

  1. それらの両方が「異なる」言語であることを考えると、C ++コンパイラがC言語で書かれたコードのサポートをやがて停止する可能性があります(現代のc ++はポインタ、動的メモリ処理などの基本的なもののためにCの考え方とは異なるため)

_GenericC99またはC11には、C ++バージョンではサポートされていない多くの機能(例:可変長配列、フレキシブル配列メンバー、、 ...)があります。


多言語プログラムについて:JNIを広範囲に使用するプログラムは、C / Javaプログラムと呼ばれます。2つの言語が一緒に使用されるという事実は、それらが一緒にコンパイルされることを意味しません。
イミビス

1
stroustrup.com/bs_faq.html#C-is-subset "厳密な数学的意味では、CはC ++のサブセットではありません...しかし、C ++はCがサポートするすべてのプログラミング手法をサポートしています...数時間で数万行のCをCスタイルのC ++に変換できるため、C ++はANSI Cのスーパーセットであり、ANSI CはK&R Cのスーパーセットであり、ISO C ++はC ++のスーパーセットです。それは1985年に存在していたとしてよく書かれてCはまた、法的なC ++になりがち例えば、カーニハン&リッチー内のすべての例:「Cプログラミング言語(第2版)は、」また、C ++のプログラムです「。
ベン

「Cプログラミング言語(第2版)」の最初のプログラム(hello world)は、C ++では無効なmainの戻り値の型を省略しています。
ouah

1
@ ouah、Stroustrup教授はその1つを逃したように見えます:-) C11でも許可されていないことに注意してください:-) C ++の以前のバージョンでも許可されていることは確かです。
ベン

4
@ouah、これはC ++の最初のバージョンではありません。この本は1988年のもので、当時はどちらの言語もISO標準ではありませんでした。当時のC ++の現在のバージョンは、Bjarne Stroustrupの1985年の本でした。
ベン

17

一部のプログラムは、CとC ++の混合で記述されています

これは人生の事実です。CおよびC ++からオブジェクトファイルをコンパイルし、それらをリンクできます。結果はかなり合理的に「C / C ++プログラム」と呼ばれます。

しかし、それはプログラム全体です。個々のコンパイル単位はどうですか?

C ++のサブセットでもあるCのサブセットがあります

そのサブセットで記述されたプログラム(またはコンパイル単位)は、適合CおよびC ++コンパイラーの下でコンパイルされ、同じように動作します。このようなプログラムまたはファイルは、「C / C ++プログラム」または「C / C ++ファイル」と呼ぶことができます。

ヘッダーファイルなどの部分的なプログラムは、CおよびC ++プログラムの両方で使用することもできます。このようなヘッダーファイルは、C / C ++ヘッダーと正しく呼ぶことができます。

引用Bjarne Stroustrup教授:

CはC ++のサブセットですか?

厳密な数学的意味では、CはC ++のサブセットではありません。有効なCであるが有効なC ++ではないプログラムや、CとC ++で異なる意味を持つコードを記述するいくつかの方法さえあります。ただし、C ++は、Cでサポートされるすべてのプログラミング手法をサポートします。すべてのCプログラムは、同じランタイムおよびスペース効率で、C ++で本質的に同じ方法で作成できます。数時間で数万行のANSI CをCスタイルのC ++に変換できることは珍しくありません。したがって、C ++はANSI Cのスーパーセットであり、ANSI CはK&R Cのスーパーセットであり、ISO C ++は1985年に存在したC ++のスーパーセットです。

よく書かれたCは、正当なC ++でもある傾向があります。たとえば、Kernighan&Ritchieのすべての例:「The C Programming Language(2nd Edition)」もC ++プログラムです。

だから、はい、C / C ++のようなものがあります。有効なCと有効なC ++の両方であるものは何でもです。

CプリプロセッサはC言語の一部です。C ++プリプロセッサはC ++言語の一部です

CまたはC ++でコンパイルし、異なるコンパイル単位を作成できます。たとえば、Cでコンパイルされた基本的な機能を備えていても、C ++でコンパイルされている場合はC ++ライブラリを利用できます。

プログラムが本質的に同じであるが、追加機能がある場合、それが同じプログラムであると言うのはまったく間違っていません。その同じですが、また異なっています。

ほとんどのCプログラマーは、少なくとも少しのC ++を実行でき、その逆も可能です。

そのような人をC / C ++プログラマと呼ぶのは理不尽ではありません。はい、おそらく1つに特化していますが、文字通り他の言語のいずれも行うことができない有能なCまたはC ++プログラマーはいますか?ある意味では、全員が C / C ++プログラマーではありませんか?

「C / C ++」と言っても何も問題はありません。重要なことは理解されている

英語は三段論法を表現するためのツールではありません。あなた論理のために英語を使うことができますが、それはただ、そして多大な努力が必要です。

これは、単語が自然に正確な意味を持つのではなく、意味と意味のあいまいな雲があるためです。重要なのは、あなたが言っていることを人々が理解しているかどうかです。


5
@BЈовић彼らは用語の小さな部分の許容性についてあなたに同意しないので、彼らは違いを理解しておらず、能力がないと結論付けます。それは非常に不合理なことです。
ベン

4
@ el.pescadoはい。実際、人々はPHP / JavaScriptを参照していることがわかります。何故なの?ポイントは言葉でゲームをするのではなく、理解することです。
ベン

10
@BЈовићあなたは意味がありません。それらは「完全に異なる」わけではありません。C ++はC よりもはるかに大きな言語ですが、Cのほとんどすべてが含まれています。C ++が適切なスーパーセットになるのを妨げる非互換性がありますが、追加の予約語​​のように小さいため、さらにキャストが必要になりますが、それはほぼそれです。それは、ほとんど適切なスーパーセットであり、完全ではありません。
ベン

7
@BЈовићたぶん、あなたは私が書いたことを理解していなかったでしょう。CプログラムをC ++としてもコンパイルできるように、あらゆる場合にCプログラムをどのように適合させることができるかを確認するために、ここを見てみませんか。david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
ベン

7
@BЈовићあなたが専門用語に精通している人であれば、Cは「機能的」ではなく、「手続き型」であることに注意する必要があります。
RM

15
  1. C / C ++という用語の使用をやめるべきですか?

絶対に。このコンストラクトが何を表現するのかは明確ではありませんが、おそらく、この用語を使用する人に代わってCとC ++が何をしているのかについての混乱があります。

この混乱は欲求不満の一般的な原因であるため、多くの人々はそれについて非常に感情的になり、その用語の出現だけであなたの貢献に対して否定的になるのに十分な理由になります。これはばかげているように見えるかもしれませんが、私たちが持っているもののようです。

「C / C ++」について話す代わりに、あなたが実際に意味を明確にする用語を使用することをお勧めします。

  • C ++に当てはまるかもしれないし、当てはまらないかもしれないCの何かについて話しているなら、単にCと言ってください。

    例: Cで関数をどのmainように宣言する必要がありますか?

    最初は、C ++の答えは同じように思われるかもしれません:int main()またはint main(int, char**)。しかし、議論が進むにつれて、C ++では、関数はグローバルスコープで宣言されなければならないことを指摘するのが適切かもしれませんnamespace。これはs がないため、Cでは意味がありません。一方、Cではmain再帰的に呼び出すことができますが、C ++ではできません。C ++では、暗黙のがありreturn 0;ますが「落ちる」場合mainが、C言語でreturn文が任意のパスに必要です。リストが続き、議論する言語が何であるかを前もって明確にすれば、議論がずっと簡単になります。

  • C ++でCに当てはまる場合とそうでない場合がある場合は、単にC ++と言います

    例: ウィルmalloc()のED配列intsが、最初はC ++ですべてゼロのこと?

    Cの短い答えはたまたま同じです:いいえ。しかし、答えが進むにつれてcalloc、Cでは、A +を使用std::vector<int>する方が良い選択であったかもしれないが、Cでは良い選択肢になることを指摘する価値があるかもしれません。

  • CとC ++の類似点を指摘したい場合は、CとC ++を言います

    例: CおよびC ++では、sizeofan intは実装が定義されており、コンパイラとアーキテクチャによって異なる場合があります。

    ここで、CとC ++が同じように動作することを指摘したいと思います。両方の言語について明示的に話し合ってます。

実際には、より具体的になり、「C」または「C ++」だけでなく、正確なバージョンについて話すことをお勧めします。両方の言語は進化しており、

C ++サポート/* … */// …コメントCのみがサポートされていながら、/* … */スタイルを。

正しいことも間違っていることもありません。

  1. #1の答えが「はい」の場合、CとC ++を組み合わせて使用​​するプログラムをどのように呼び出すのでしょうか?

言語は重複しているため、すべてのCプログラムには、C ++のように見える部分と、その逆の部分が含まれます。それでも、著者はおそらくCまたはC ++コンパイラの使用に落ち着くでしょう。だから、「プログラムが書き込まれていると言うC Cコンパイラでコンパイルされると、」プログラムが書き込まれている場合、「C ++、彼らはC ++コンパイラを使用する場合、彼らは現代の任意のC ++の機能を使用することを拒否する可能性がある場合でも、」。このようなC ++コードをCスタイルC ++と呼ぶ人もいます。オーバーロード、例外、ポリモーフィズム、テンプレート、およびI / Oストリームの欠如は、このようなコードの一般的な特性です。

代わりに、いくつかのファイルCで書かれており、Cコンパイラといくつかでコンパイルされている場合は、他のファイルはC ++で書かれ、C ++コンパイラでコンパイルして、オブジェクトファイルを一緒にリンクされている、私はプログラムが書き込まれている」と言うでしょうCとC ++のミックス」は、実際には既に行ったとおりです。

ただし、代わりに、作成者がすべてのファイルをC または C ++コンパイラでコンパイルできるように細心の注意を払って作成し、結果のプログラムが同じことを行う場合、「プログラムCおよびC ++の共通サブセットで記述されています」。

後者は、CコードとC ++コード間で共有されるヘッダーファイルの場合がよくあります。ところで、そのようなコードを書くのは簡単ではありません。あなたはさらにだけこのような構築物は、CおよびC ++で有効であることに使用されたことを強調したい場合大きく異なるコンパイラベンダーによってサポートされている、用語ポータブル CおよびC ++の共通のサブセットは、このことを強調するために使用することができます。

  1. それらの両方が「異なる」言語であることを考えると、C ++コンパイラはC言語で書かれたコードのサポートをやめる可能性があります(現代のC ++はポインタ、動的メモリ処理などの基本的なもののためにCの考え方とは異なるため)?

この質問を理解したかどうかはわかりません。CとC ++ 異なる言語であるため、一方のコンパイラが他方の言語用に作成されたプログラムを受け入れることは期待できません。ただし、コンパイラは多くの場合、モジュール方式で設計されており、コンパイラにC ++ フロントエンドがある場合、Cフロントエンドもある可能性が高くなります。(コマンドラインスイッチまたは同様の方法で、どちらを使用するかを選択します。)両方の言語が広く使用されている限り、これが変更されることはほとんどありません。「モダンC ++」についてのあなたのポイントは、基本的には優れたコーディング標準と標準ライブラリの問題だと思います。コンパイラの視点、両方の言語の進化ではなく発散よりも収束しています。

  1. 現在、互換性を維持するためにC / C ++の標準を作成している人々の間にコラボレーションはありますか?

はい。C ++ 11およびC11で導入されたメモリモデルとアトミック操作ライブラリが良い例です。両言語の設計者は、互換性が重要であることを認識しており、互換性の改善に取り組んでいるようです。個人的には、コラボレーションがより強力になり、2つのISOワーキンググループが参加することさえあればいいのですが、私の願いは重要ではありません。

Bjarne Stroustrupは、皮肉なことに「C / C ++互換性」というタイトルの第4版C ++プログラミング言語の 44.3で、CとC ++のさまざまなバージョンの違いと共通性について語っています。この場合、何を意味するのかが明確であるため、この用語の使用は実際には適切かもしれません。

  1. #4が「はい」の場合、このようなコラボレーションは近い将来、現代のC ++の登場で終わる可能性があります(11/14/17)

上記で説明したように、それはC ++ 11で発生し、再び発生することが予想/期待/必要です。


どうしてそれは正しいことでも間違っていることでもないのでしょうか?
JDługosz

4
「グリーンなものは高価だ」という声明の場合のように、明確に定義された真理値を持っていません。CとC ++のバージョンの特定の組み合わせに対してはtrueであり、他のバージョンに対してはfalseです。
5gon12eder

5

C / C ++は、CとC ++の共通部分です。

int new;はC / C ++ではなく、どちらでもありませんvector<int> foo;

同様に、C89 / C99はこれら2つの言語の共通部分であり、どちらも許可されていないenum bool { false, true };for(int i = 0;;)、許可されていません。

C ++ 11 / C ++ 14など

C ++ 11およびC ++ 14でコンパイル(および正しく実行)するコードを作成することは可能ですが、一方でコンパイルしても、他方でコンパイルすることを意味するわけではありません。実際、多くの人がこれをしています。

そして、多くの人がCとC ++で動作するコードを書きます。

明らかに、オーバーラップが大きいほど、意味があります。C / C ++ / Javaコードについての質問はありません。


これらの言語の共通のサブセットについて話すのは「理にかなっています」が、多くの質問ではこのサブセットに答えがありません

ただし、複数の言語仕様で機能するコードについては、それらの仕様が「バージョン」または「言語名」などによって区別されているかどうかについて話すことができます。


3

これは、他の回答やコメントのいくつかで見られる「これは金属に近いプログラマー向けのコードであり、管理コンテキストで問題ない」という立場に対する一種の回答です。


私は、その解釈でさえ注意を払うべきだと主張します。

少なくとも90年代半ば以降、C ++プログラマーと、Cプログラマーであると自分自身を説明したい人がいれば、オブジェクト指向設計についてどれだけ知っているか、オブジェクトのデバッグについてどれだけ経験があるかを尋ねなければなりませんでした指向のコンテキスト、およびテンプレートライブラリを使用する能力について。面接や採用の過程で、これらの問題を正確に調査したいと思うでしょう。

反対に、C ++の達人が「現代のC ++」をプッシュし始めてから10年以上が経ちました。つまり、ベアポインターからより安全なポインターオブジェクトとイテレーターベースのイディオムへの移行を重視しています。C ++ 11の登場により、マルチパラダイムプログラミングが明示的にサポートされるようになり、ベアポインターを示さないコードへのプッシュは非常に強力になりました。つまり、CポジションのC ++プログラマーに今日インタビューした場合、この人物が実際のフットシューティング対応ポインターにどれだけ慣れているかを確認することを非常に心配します。

私は最近ビジネスをしていません(スタックオーバーフローが始まったばかりの頃でさえ)ので、架空のインタビュイーがクロスオーバースキルを持たない頻度を推測することはありませんが、最も頻繁に適用されるように、言語は実際に非常に異なっていると思います。

要するに、「C / C ++」は、技術的なコンテキストだけでなく、ほとんどのビジネスコンテキストでも同様に削除する必要があります。


「CかC ++のどちらかを知っている」、「CとC ++の相互リンク」、「CとC ++の共通部分」、「CかC ++のどちらを気にしている」のどちらかを意味する曖昧さを指摘する良い方法どうにかして逃げることができる場合でも、ますます正当化されなくなります。
デデュプリケーター

2

この質問に対する最も簡単な答えは、その用語を使用すべきではないということです。存在してはならない用語です。意味がありません。すべてのプログラムは、CまたはC ++です。

そして、C ++ x0、C ++ 11(または一般的な現代のC ++ 11/14/17)が登場するまで、それは静かでした。

C ++ 98と03は、クラスを持つリモートCでもありません。あなたにこれを教えた人は誰でもたわごとを知らず、あなたはそれらを忘れることができます。これは決して正しくありませんでした。


これは完全に真実ではありません。かつて、「C / C ++」と呼ばれる言語の提案された言語仕様を記述したページがありました。これは、とりわけ、型システムの(ほぼ)不在を指定していました。残念なことに、ページはその後削除され、それをホストしていたサイトはrobots.txtを作成し、archive.orgからアーカイブされたコピーを消去しました。
greyfade

1
ああ、私はarchive.isのコピーを見つけました: RationaleSyntax、Semantics
greyfade

5
「すべてのプログラムはCまたはC ++のいずれかです。」同意しません。Cプログラムを使用して、一度に1つのファイルをC ++に移植することは非常に一般的です(その1つのファイルのコンパイラオプションを変更することにより)。一部のファイルは移植されず、永久にCのままになる場合があります。このようなプログラムは、CとC ++の両方で書かれています
-nikie

あんまり。そのプログラムはサブプログラムで構成され、各サブプログラムはCまたはC ++です。コンパイラーに関する限り、プログラム全体である各TUは、CまたはC ++としてコンパイルされます。
-DeadMG

3
「すべてのプログラムがCまたはC ++のいずれか」というわけではありません。Bjarne Stroustrup教授は次のように述べています。「よく書かれたCは合法的なC ++でもある傾向があります。たとえば、Kernighan&Ritchieのすべての例:「Cプログラミング言語(第2版)」もC ++プログラムです。stroustrup.com/bs_faq.html#C-is-subset
ベン

1

概念的には、Cソースファイルの設計に特別な困難はないはずなので、C ++でそのままコンパイルすることもできます。実際、これを行うことにはいくつかの重要な利点があります。たとえば、組み込みシステム用のコードを作成する場合、ホストされたPC環境でコードをテストできると便利な場合があります。コードがC ++として正常にコンパイルされる場合、「MOTOR_ENABLE = 1;」のようなステートメントを持つことができます。組み込みシステム(Cとしてコンパイル)の揮発性I / Oビットに書き込みますが、PCでエミュレーションロジックをトリガーします(C ++としてコンパイル)。おそらく、小さな組み込みシステムでuint16_tが動作するように動作するPCでC ++型を設計することも可能です(たとえば、与えられたu16 x=65533;場合、コンパイラはx*x9として、望むものを自由に統治するのではなく)、まだ私のエミュレーターのどれもそれを含んでいませんでした(私が使用したC ++コンパイラーはそのような場合に奇抜なことを何もしなかったからです)。

残念ながら、CプログラマーとC ++プログラマーは、言語が長年にわたって互換性のある方法で進化してきたことに対して十分な反感を抱いています。C89はC ++のより便利な機能(関数プロトタイプなど)の一部を適応させようとしましたが、C ++の機能のいずれかを必要とするプログラマーはC ++を使用するべきであるという考え方が浮かび上がったようです。 C ++の一部の機能を使用できるようにすると便利です(たとえば、必要のない他の機能に関連するコストを受け入れることなく、静的または静的インラインリンケージで関数をオーバーロードする機能(たとえば、エクスポートに関連する名前のマングリングオーバーロードされた関数)。

C89とC ++ 98の共通部分は実行可能な言語ですが、Cの以降のバージョンとC ++の以降のバージョンの使用可能なスーパーセットは、成長するよりも縮小する可能性があります(厳密なエイリアス規則などのおかげ)。亀裂が増加します。


1
「C ++ 95」とは何ですか?技術レポート?
ベンフォークト

1
内部関数をオーバーロードし、外部関数の名前を変更しない場合は、前者を匿名namespaceにし、後者をとして宣言してextern "C"から、C ++コンパイラを使用できます。
5gon12eder

@BenVoigt:まあまあ。見上げるべきだった。C99より前のC ++バージョン。C89が登場したとき、CをC ++のようにしようとしましたが、C99はC ++には絶対に興味のないかなりの数の機能(可変長配列など)を追加しました。私はC ++であまりプログラミングしていませんが、C ++の機能がいくつかあると、分岐機能が助けてくれた以上にCを助けてくれると思います。
supercat

@ 5gon12eder:C ++コードをCプロジェクトにリンクしようとしたことはありません。それはすべてが静的/インラインのいずれかであるのと同じくらい本当に単純なのか、extern "C"それとも他の複雑さ(静的オブジェクトの初期化など)がありますか?C ++でマクロをfoo(1234)呼び出し、[どこに定数がないか]が関数を呼び出すようにする方法はありますか?埋め込みコードには、ポートと状態が両方であるかどうかに基づいて3つの形式を持つような「関数」に意味がある多くの状況がありますfoo_const(1234)foo(x)xfoo_var(x)SET_PORT(port, state)
...-supercat

...コンパイル時定数、ポートは定数ですが、状態はそうではない、またはポートも状態も定数ではない場合。テンプレートまたは他の標準C ++メカニズムを使用してそれをきれいに達成する方法はありますか、またはgcc拡張を備えたコンパイラでのみ可能ですか?
supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.