g++和gcc的区别是什么?它们中的哪一个应该用于一般的c++开发?


当前回答

一个显著的区别是,如果你传递一个。C文件给gcc,它将被编译为C。

g++的默认行为是将. C文件视为c++(除非指定了-x C)。

其他回答

“GCC”是GNU编译器集合的常用缩写。这既是编译器最通用的名称,也是在强调编译C程序时使用的名称(作为以前代表“GNU C compiler”的缩写)。

当提到c++编译时,通常称编译器为“g++”。由于只有一个编译器,所以无论在什么语言环境中,都可以准确地称其为“GCC”;然而,当重点是编译c++程序时,术语“g++”更有用。

你可以在这里阅读更多。

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

g++和gcc的区别是什么?

gcc已经从单一语言的“GNU C Compiler”发展成为一个多语言的“GNU Compiler Collection”。在C编程的上下文中,术语gcc有时仍指“GNU C编译器”。

man gcc

# GCC(1)                     GNU
# 
# NAME
#        gcc - GNU project C and C++ compiler

然而,g++是GNU编译器集的c++编译器。像gnat是gcc的Ada编译器。参见使用GNU编译器集合(GCC)

例如,Ubuntu 16.04和18.04 mang++命令返回GCC(1)手册页面。

Ubuntu 16.04和18.04 man gcc声明…

g++接受与GCC基本相同的选项

这是默认的。

... 使用gcc不添加c++库。g++是一个程序 调用GCC并自动指定针对c++的链接 图书馆。它将.c, .h和.i文件视为c++源文件,而不是 C源文件,除非使用-x。这个程序在以下情况下也很有用 预编译一个扩展名为.h的C头文件,以便在c++中使用 编译。

搜索gcc手册页以获得关于gcc和g++之间的选项差异的更多详细信息。

一般的c++开发应该使用哪一种?

从技术上讲,gcc或g++都可以用于具有适当选项设置的通用c++开发。然而,g++的默认行为自然地与c++开发保持一致。

Ubuntu 18.04的“gcc”手册页增加了以下段落,Ubuntu 20.04继续有:

运行GCC的通常方法是运行名为GCC的可执行文件,或者交叉编译时运行machine-gcc,或者运行machine-gcc-version来运行特定版本的GCC。在编译c++程序时,应该将GCC作为g++调用。


注:以Xcode为例。应用程序嵌入工具链,g++只是链接到gcc。因此,g++调用可能在每个工具链的基础上有所不同。

ls -l /Applications/Xcode.app/Contents/Developer/usr/bin
# …
# lrwxr-xr-x  1 root  wheel         3 Apr 27  2021 g++ -> gcc
# -rwxr-xr-x  1 root  wheel    167120 Nov 23 20:51 gcc

### -- versus --
which -a g++
# /usr/bin/g++
ls -l /usr/bin/g++
# -rwxr-xr-x  1 root  wheel  137616 Jan  1  2020 /usr/bin/g++

虽然gcc和g++命令做的事情非常相似,但g++被设计为编译c++程序时调用的命令;它的目的是自动做正确的事情。

在幕后,它们实际上是同一个程序。据我所知,两者都根据文件扩展名来决定是将程序编译为C还是c++。两者都能够链接到c++标准库,但默认情况下只有g++这样做。因此,如果你有一个用c++编写的程序,碰巧不需要链接到标准库,gcc将碰巧做正确的事情;但是,g++也一样。因此,没有理由不使用g++进行一般的c++开发。

我对这个问题产生了兴趣,并做了一些实验

I found that description here, but it is very short. Then I tried to experiment with gcc.exe and g++.exe on my windows machine: $ 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 I tried to compile c89, c99, and c++1998 simple test files and It's work well for me with correct extensions matching for language 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 But when I try to run "gnu compiler collection" tool in that fashion: $ 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] But this one still work with no errors $ gcc -x c++ -std=c++98 test_cpp.c And this also $ g++ -std=c++0x test_cpp_11.cpp

p.s.测试文件

$ 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标志。看到这个