6

重複の可能性:
「C ++のCサブセット」->どこにありませんか?例?

CがC++のサブセットであることを認識しています(つまり、有効なC ++コードではない有効なCコードは存在しません)。私の質問はg++、すべてのCコードと完全に互換性があるかどうかです。たとえば、

g++ -o testing test.c

と同一のバイナリを生成します

gcc -o testing test.c

すべての状況で?

より具体的には、それらが常に同一のバイナリを作成するとは限らない場合、それが問題になる可能性がある理由はありますか?g++コードがわからない場合は、常に使用しても安全ですか?

4

3 に答える 3

8

CはC++のサブセットではありません。

試す:

foo.c

int main() {
    int class = 0;
    return 0;
}

とにかくここで楽しんでください: CはC ++のサブセットではありませんか?

于 2012-07-26T18:30:16.693 に答える
3

これに答える方法を理解するのは難しいです:

  • C は C++ の完全なサブセットではありません。C には、有効な C++ ではないものがいくつかあります。可変長配列はその 1 つです。からの暗黙的なキャストvoid*は別のものです。
  • g++ が受け入れるコードは、渡されたフラグによって異なります。呼び出すだけでコンパイルされg++ますか(どのバージョンですか?)-ansiまたは -pedantic? どうstd=<lang>ですか?
  • 最後に、コードが受け入れられるかどうかは、「同一のバイナリを生成するかどうか」とはまったく別の問題です。両方のコンパイラで受け入れられるコードは、同じことを行うバイナリになる可能性がありますが、それでも同一ではありません。

このあいまいさを考えると、決定的な答えを出すことは不可能です。

于 2012-07-26T18:32:10.697 に答える
2

C は C++ のサブセットではありません。それは決してありませんでした。C99 は C++ とは大きく異なりますが、従来の C89/90 でさえ C++ のサブセットではなく、多くの重要な違いがあります。

C89/90 の場合でも、C++ コンパイラで有効な C コードを「壊す」という違いが含まれます。

  1. C++ でのより制限的な暗黙的なポインター型変換
  2. ネストされた構造体宣言は、C++ ではクラス スコープであり、C ではファイル スコープです。
  3. 演算子の文法 (およびその結果の演算子の優先順位) は、言語間でわずかに異なります
  4. C++ では仮定義は違法です
  5. 新しいキーワード、intC++ の暗黙のルールなし...
  6. などなど
于 2012-07-26T18:36:31.353 に答える