g++ と gcc の違いは何ですか? 一般的な C++ 開発に使用する必要があるのはどれですか?
10 に答える
gcc
およびGNU Compiler Collectiong++
のコンパイラ ドライバです(かつては GNU C Compilerのみでした)。
cc1
cc1plus
ファイルの種類に応じて呼び出すバックエンド ( ...) を自動的に決定しますが-x language
、 でオーバーライドされない限り、いくつかの違いがあります。
デフォルトのおそらく最も重要な違いは、自動的にリンクするライブラリです。
GCC のオンライン ドキュメントのリンク オプションとg++ の呼び出し方法によると、は(1 番目はコンパイラ オプション、2 番目の 2 つはリンカー オプション)g++
と同等です。gcc -xc++ -lstdc++ -shared-libgcc
これは、オプションを指定して両方を実行することで確認でき-v
ます (実行中のバックエンド ツールチェーン コマンドが表示されます)。
GCC: GNU コンパイラ コレクション
- GNU コンパイラでサポートされているすべての異なる言語へのリファラー。
gcc
: GNU C コンパイラ
g++
: GNU C++ コンパイラ
主な違い:
gcc
*.c\*.cpp
ファイルはそれぞれ C および C++ としてコンパイルされます。g++
コンパイルされます:*.c\*.cpp
ファイルですが、それらはすべて C++ ファイルとして扱われます。- また
g++
、オブジェクト ファイルをリンクするために使用すると、std C++ ライブラリに自動的にリンクされます (gcc
これは行われません)。 gcc
C ファイルをコンパイルすると、定義済みマクロが少なくなります。gcc
ファイルのコンパイル*.cpp
とg++
コンパイル*.c\*.cpp
には、いくつかの追加のマクロがあります。
*.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 フロントエンドはそれを行いません (適切なコマンド ライン オプションを渡せば、それらとリンクすることもできます)。
.c
注目すべき違いの 1 つは、 gcc にファイルを渡すと、C としてコンパイルされることです。
g++ のデフォルトの動作は、.c
ファイルを C++ として扱うことです (-x c
指定されていない限り)。
gccコマンドとg++コマンドは非常によく似た動作をしますが、g ++は、C++プログラムをコンパイルするために呼び出すコマンドになるように設計されています。それは自動的に正しいことをすることを目的としています。
舞台裏では、それらは実際には同じプログラムです。私が理解しているように、どちらもファイル名拡張子に基づいてプログラムをCとしてコンパイルするかC++としてコンパイルするかを決定します。どちらもC++標準ライブラリに対してリンクできますが、デフォルトでこれを行うのはg++のみです。したがって、C ++で記述されたプログラムがあり、標準ライブラリに対してリンクする必要がない場合、gccはたまたま正しいことを行います。しかし、その後、g++もそうなります。したがって、一般的なC++開発にg++を使用しない理由は実際にはありません。
私はその問題に興味を持ち、いくつかの実験を行いました
その説明はこちらで見つけましたが、非常に短いです。
次に、Windows マシンで 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 です。
gcc は、拡張子が正しい場合、または正しい -std -x フラグを設定している場合、メタツールとして正常に動作します。これを見る
「GCC」は、GNU Compiler Collection の一般的な略語です。これは、コンパイラの最も一般的な名前であり、C プログラムのコンパイルに重点が置かれている場合に使用される名前でもあります (略語は以前は「GNU C Compiler」を表していたため)。
C++ コンパイルを指す場合、コンパイラを「G++」と呼ぶのが一般的です。コンパイラは 1 つしかないため、言語のコンテキストに関係なく、「GCC」と呼ぶのも正確です。ただし、C++ プログラムのコンパイルに重点が置かれている場合は、「G++」という用語の方が便利です。
詳しくはこちらをご覧ください。