G ++とgccの違いは何ですか?どれが一般的なC++開発に使用されるべきですか?
gcc
とg++
はGNUコンパイラ Collection (かつては一度だけGNU Cコンパイラ であった)のコンパイラドライバです。
たとえファイルタイプに応じてどのバックエンド(cc1
cc1plus
...)を呼び出すかが自動的に決定されても、-x language
でオーバーライドされない限り、いくつかの違いがあります。
デフォルトでおそらく最も重要な違いは、どのライブラリを自動的にリンクするかです。
GCCのオンラインドキュメント link options および g ++の呼び出し方法 によると、g++
はgcc -xc++ -lstdc++ -shared-libgcc
と同じです(1番目はコンパイラオプション、2番目は2つはリンカオプションです)。これは、-v
オプションを付けて実行することで確認できます(実行中のバックエンドツールチェーンコマンドが表示されます)。
GCC:GNUコンパイラコレクション
gcc:GNU Cコンパイラ
g ++:GNU C++コンパイラ
主な違い:
* .cppファイルをコンパイルするときの追加のマクロ
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
C++では、g ++を使うべきです。
それは同じコンパイラです(例えばGNUコンパイラコレクション)。 GCCまたはG ++は、異なるデフォルトオプションで異なるフロントエンドを選ぶだけです。
一言で言えば:あなたがg ++を使うならフロントエンドはあなたがC++標準ライブラリとリンクしたいかもしれないとリンカに伝えます。 gccのフロントエンドはそれをしません(あなたが正しいコマンドラインオプションを渡した場合にもリンクできます)。
g++
とgcc
の違いは何ですか?
gcc
は単一言語の "GNU C Compiler"から多言語 "GNU Compiler Collection"へと進化しました。 「GNU Cコンパイラ」という用語は、Cプログラミングの文脈の中で今でも時々使われています。
g++
isGNUコンパイラコレクション用のC++コンパイラ。gnat
はgcc
用のAdaコンパイラです。 GNUコンパイラコレクションの使用(GCC)
例えば、Ubuntu 16.04と18.04のman g++
コマンドはGCC(1)
マニュアルページを返します。
Ubuntu 16.04と18.04のman gcc
は次のように述べています...
g++
はgcc
とほとんど同じオプションを受け付けます
そしてそれはデフォルト...
...
gcc
を使用してもC++ライブラリは追加されません。g++
はGCCを呼び出し、C++ライブラリに対するリンクを自動的に指定するプログラムです。 -xが使用されていない限り、.c、.h、および.iファイルをCソースファイルではなくC++ソースファイルとして扱います。このプログラムは、C++コンパイルで使用するために.h拡張子を持つCヘッダーファイルをプリコンパイルするときにも役立ちます。
gcc
とg++
のオプションの違いに関する詳細は、gcc
のmanページを検索してください。
一般的なC++開発にはどれを使うべきですか?
技術的には、gcc
またはg++
のいずれかを適切なオプション設定で一般的なC++開発に使用できます。ただし、g++
のデフォルトの動作は、当然C++開発に合わせられています。
Ubuntu 18.04のマニュアルページに次の段落が追加されました。
GCCを実行する通常の方法は、
gcc
、クロスコンパイル時はmachine-gcc
、GCCの特定のバージョンを実行するmachine-gcc-version
という実行可能ファイルを実行することです。 C++プログラムをコンパイルするときは、代わりにGCCをg++
として呼び出す必要があります。
Gccコマンドとg ++コマンドは非常によく似た動作をしますが、g ++はC++プログラムをコンパイルするために呼び出すコマンドとして設計されています。それは自動的に正しいことをすることを意図しています。
舞台裏では、彼らは本当に同じプログラムです。私が理解しているように、両方ともファイル名拡張子に基づいてCとC++のどちらとしてプログラムをコンパイルするかを決定します。どちらもC++標準ライブラリに対してリンクできますが、デフォルトではg ++のみがこれを行います。そのため、C++で書かれたプログラムで標準ライブラリとリンクする必要がない場合は、gccが正しい動作をすることになります。しかしそれから、g ++もそうです。そのため、一般的なC++開発にg ++を使用しない理由は本当にありません。
唯一の注目すべき違いは、.c
をgccに渡すとCとしてコンパイルされるのに対し、g ++は常にC++として扱うという点です。
私はこの問題に興味を持ち、いくつかの実験を行いました
私はその説明を見つけました ここ 、しかしそれは非常に短いです。
それから私は私のウィンドウズマシン上でgcc.exeとg ++。exeを試してみました:
$ g++ --version | head -n1
g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
$ gcc --version | head -n1
gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
C89、c99、およびc ++ 1998の単純なテストファイルをコンパイルしようとしましたが、言語に合った正しい拡張子で私にはうまくいきます。
gcc -std=c99 test_c99.c
gcc -std=c89 test_c89.c
g++ -std=c++98 test_cpp.cpp
gcc -std=c++98 test_cpp.cpp
しかし、私がそのような方法で "GNUコンパイラコレクション"ツールを実行しようとすると:
$ gcc -std=c++98 test_cpp.c
cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
しかし、これはまだエラーなしで動作します
$ gcc -x c++ -std=c++98 test_cpp.c
そしてこれも
$ g++ -std=c++0x test_cpp_11.cpp
pSテストファイル
$ cat test_c89.c test_c99.c test_cpp.cpp
// C89 compatible file
int main()
{
int x[] = {0, 2};
return sizeof(x);
}
// C99 compatible file
int main()
{
int x[] = {[1]=2};
return sizeof(x);
}
// C++1998,2003 compatible file
class X{};
int main()
{
X x;
return sizeof(x);
}
// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
std::vector<int> a {1,2,3}; // bracket initialization
return 0;
}
所見:
プロセスツリーを見ると、gccとg ++が私の環境では他のツールのバックエンドになっているようです。cc1plus.exe、cc1.exe、collect2.exe、as.exe、ld.exe
あなたが正しい拡張子を持っているか、または正しい-std -xフラグを設定するならば、gccはmetatoolとしてうまく働きます。 これ を参照
“ GCC”はGNU Compiler Collectionの一般的な短縮形です。これは、コンパイラの最も一般的な名前であり、Cプログラムのコンパイルに重点が置かれている場合にも使用される名前です(以前は「GNU Cコンパイラ」の略語でした)。
C++コンパイルを参照するときは、通常、コンパイラを「G ++」と呼びます。コンパイラは1つしかないので、言語の文脈が何であれ、それを「GCC」と呼ぶのも正確です。ただし、「G ++」という用語は、C++プログラムのコンパイルに重点が置かれている場合にはさらに便利です。
もっと読むことができます ここ 。
私はLinuxシステムでgccとg ++をテストしていました。 MAKEFILEを使うことで、 "GNU make"で使われるコンパイラを定義することができます。 "C plus plus"のいわゆる "動的メモリ"検索機能を使ってテストしました。
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}
Gccがエラーを報告するのに対し、g ++だけが私のコンピュータでうまくコンパイルできます。
undefined reference to `operator new(unsigned long)'
だから私自身の結論は、gccは "C plus plus"を完全にはサポートしていないということです。 C++ソースファイルにg ++を選択するのがより良い選択肢のようです。
gccとg ++はどちらもGNUコンパイラです。どちらもcとc ++をコンパイルします。違いは* .cファイルです。gccはそれをcプログラムとして扱い、g ++はそれをc ++プログラムと見なします。 * .cppファイルはc ++プログラムと見なされます。 c ++はcのスーパーセットであり、構文はより厳密なので、接尾辞については注意してください。