CC、gcc、g ++の違いは?


104

アセンブリコードの生成、使用可能なライブラリ、言語機能などの点で、CおよびC ++コードをコンパイルするときの3つのコンパイラCC、gcc、g ++の違いは何ですか?


1
私の答えに示されているように-あなたの質問に対する答えはプラットフォームによって異なりますが、プラットフォームは指定されていません。
ジョナサンレフラー、

回答:


122

これに対する答えはプラットフォーム固有です。たとえば、Linuxで起こることはSolarisで起こることとは異なります。

簡単な部分(プラットフォーム固有ではないため)は、「gcc」と「g ++」の分離です。

  • gccは、GCC(GNUコンパイラコレクション)のGNU Cコンパイラです。
  • g ++はGCCのGNU C ++コンパイラです。

難しいのは、プラットフォーム固有であるため、「CC」(および「cc」)の意味です。

  • Solarisでは、CCは通常、Sun C ++コンパイラの名前です。
  • Solarisでは、ccは通常、Sun Cコンパイラの名前です。
  • Linuxの場合、存在する場合、CCはおそらくg ++へのリンクです。
  • Linuxでは、ccはgccへのリンクです。

ただし、Solarisであっても、ccはの古いBSDベースのCコンパイラである可能性があります/usr/ucb。実際には、それは通常インストールされず、失敗するスタブがあり、自動構成ソフトウェアをコンパイルしてインストールしようとする人に大混乱をもたらします。

HP-UXでは、デフォルトの「cc」は、必要に応じてカーネルの再リンクを可能にするためにインストールされたK&RのみのCコンパイラであり、標準のCをサポートしていないため、最新のソフトウェア作業には使用できません。別のコンパイラ名を使用する必要があります( 'acc' IIRC)。同様に、AIXでは、システムCコンパイラーは「xlc」や「xlc32」などの名前で処理されます。

古典的には、デフォルトのシステムコンパイラは「cc」と呼ばれ、自己構成ソフトウェアは他に何を使用するかわからない場合にその名前を使用します。

POSIXは、プログラムc89(元々)および後でc99が存在することを要求することにより、これを回避する方法を法制化しようとしました。これらは、ISO / IEC 9899:1989および9899:1999 C標準と互換性のあるコンパイラです。POSIXが成功したかどうかは疑わしい。


機能とライブラリの点での違いについて質問します。以前と同様に、答えは一部プラットフォーム固有であり、一部一般的です。

大きな違いは、CコンパイラとC ++コンパイラの間です。C ++コンパイラはC ++プログラムを受け入れ、任意のCプログラムをコンパイルしません。(C ++でも理解できるサブセットでCを書くことは可能ですが、多くのCプログラムは有効なC ++プログラムではありません)。同様に、CコンパイラはCプログラムを受け入れ、ほとんどのC ++プログラムを拒否します(ほとんどのC ++プログラムはCで使用できない構成体を使用するため)。

使用できるライブラリのセットは、言語によって異なります。C ++プログラムは通常、特定のプラットフォームでCライブラリを使用できます。Cプログラムは通常、C ++ライブラリを使用できません。したがって、C ++には、利用可能なライブラリのより大きなセットがあります。

Solarisを使用している場合、CCによって生成されたオブジェクトコードは、g ++によって生成されたオブジェクトコードと互換性がないことに注意してください。これらは、例外処理や名前のマングリングなどの規則が異なる2つの別個のコンパイラです(名前のマングリングは意図的に行われています)。互換性のないオブジェクトファイルがリンクされないようにするために異なります!)。つまり、CCでコンパイルされたライブラリを使用する場合は、プログラム全体をCCでコンパイルする必要があります。また、CCでコンパイルされた1つのライブラリとg ++でコンパイルされた別のライブラリを使用したい場合、運が悪いということも意味します。少なくともライブラリの1つを再コンパイルする必要があります。

生成されたアセンブラの品質に関して、GCC(GNU Compiler Collection)は非常に優れています。ただし、ネイティブコンパイラの方が少し良い場合もあります。インテルのコンパイラーには、GCCでまだ複製されていない、より広範な最適化機能があると思います。しかし、あなたがどのプラットフォームに関心を持っているのか私たちにはわからないのですが、そのような意味づけは危険です。

言語機能に関して、コンパイラーはすべて現在の標準(C ++ 98、C ++ 2003、C99)にかなり近いですが、通常、標準言語とコンパイラーがサポートする言語の間には小さな違いがあります。古いC89標準サポートは、すべてのCコンパイラで基本的に同じ(そして完全な)ものです。言語の暗い部分には違いがあります。「未定義の動作」、「システム定義の動作」、および「未指定の動作」を理解する必要があります。未定義の動作を呼び出すと、異なる時間に異なる結果が得られます。コンパイラの動作を微調整するための多くのオプション(特にGCCの場合)もあります。GCCにはさまざまな拡張機能があり、コンパイラファミリのみを対象にしていることがわかっている場合は、作業が簡単になります。


1
OSX(少なくともSierra 10.2)では、clangへのシンボリックリンクです。
Josh Kodroff

26

CCシステムのCコンパイラを参照する環境変数です。それが指すもの(ライブラリーへのアクセス可能など)は、プラットフォームによって異なります。多くの場合/usr/bin/cc、実際のcコンパイラー(ドライバー)を指します。Linuxプラットフォームでは、CCほとんどの場合、を指し/usr/bin/gccます。

gccGNUコンパイラコレクションのドライババイナリです。C、C ++、およびおそらく他の言語をコンパイルできます。ファイル拡張子によって言語を決定します。

g++はのようなドライババイナリですが、gccC ++のコンパイル用にいくつかの特別なオプションが設定されています。特に(私の経験では)g++デフォルトではlibstdc ++をリンクしますが、リンクしgccません。


1
「ドライバーバイナリ」の意味を教えてください。
Edan Maor

5
ほとんどのCコンパイラ、特にGCCには、コンパイル作業を行うプログラムが多数あります。コンパイラー・ドライバーである「gcc」と呼ばれるトップレベルのプログラムがあります。無数のコマンドラインオプションを解析し、コンパイラーの他のフェーズ(パーサー/アナライザー、オプティマイザー、アセンブラー、リンカー)をオーケストレーションします(通常、プリプロセッサーは、前処理のみを要求しない限り、通常、個別のフェーズではありません)。Cソースファイル自体には触れませんが、それ(コンパイラードライバー)は非常に複雑なプログラムです。
ジョナサンレフラー、

3
CCはSun C ++コンパイラでもあり、環境変数ではありません。
ジョナサン・レフラー、

1
SGIのC ++コンパイラもCCです。
alex tingle

まあ、私はManaguが./configure+ 使用するCコンパイラに影響を与えるmake名前の環境変数をとることができると考えていると思いますCCが、それ以外の場合、通常、その名前の環境変数はありません。
ephemient 2009年

5

Linuxのccの情報を1つだけ追加したい。gccと連動しています。それをチェックする。 ここに画像の説明を入力してください

同様に、C ++でも同じことが言えます。

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.