关于C++:G++与GCC的区别是什么?

What is the difference between g++ and gcc?

G++和GCC有什么区别?哪些应该用于一般的C++开发?


gccg++是GNU编译器集合的编译器驱动程序(以前只是GNU C编译器)。

尽管它们根据文件类型自动确定要调用的后端(cc1cc1plus…),但除非被-x language覆盖,它们还是有一些不同。

它们默认设置中最重要的区别可能是它们自动链接的库。

根据GCC的在线文档链接选项和调用g++的方式,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文件时的额外宏:

    1
    2
    3
    4
    5
    6
    #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编译器"演变为多语言"gnu编译器集合"。术语"GNUCcompiler"有时仍在C编程环境中使用。

    EDCOX1(0)是GNU编译器集合的C++编译器。像gnat一样,是gcc的ADA编译器。请参见使用GNU编译器集合(GCC)

    例如,ubuntu 16.04和18.04 man g++命令返回GCC(1)手册页。

    Ubuntu 16.04和18.04 man gcc指出…

    g++ accepts mostly the same options as gcc

    默认情况是…

    ... use of gcc does not add the C++ library. g++ is a program
    that calls GCC and automatically specifies linking against the C++
    library. It treats .c, .h and .i files as C++ source files instead of
    C source files unless -x is used. This program is also useful when
    precompiling a C header file with a .h extension for use in C++
    compilations.

    gcc手册页中搜索有关gccg++期权差异的更多详情。

    哪一个应该用于一般C++开发?

    从技术上讲,EDCOX1×1或EDCOX1(0)可用于一般的C++开发,并具有适用的选项设置。然而,EDCOX1·0的默认行为自然地与C++开发对齐。

    Ubuntu 18.04手册页添加了以下段落:

    The usual way to run GCC is to run the executable called gcc, or machine-gcc when cross-compiling, or machine-gcc-version to run a specific version of GCC. When you compile C++ programs, you should invoke GCC as g++ instead.


    虽然GCC和G+命令做的事情非常相似,但是G++被设计成用来编译C++程序的命令;它的目的是自动地做正确的事情。

    在幕后,他们真的是同一个节目。据我所知,这两种方法都是基于文件扩展名来决定是否将程序编译为C或C++。两者都可以链接到C++标准库,但默认情况下只有G++才这样做。因此,如果你有一个C++编写的程序不需要链接到标准库,GCC会碰巧做正确的事情,但是G++也会这样做。所以没有理由不使用G++来进行一般的C++开发。


    唯一的显著区别是,如果你将EDCOX1的8度传递给GCC,它将被编译成C,而G+将永远把它当作C++。


    我对这个问题很感兴趣,做了一些实验

  • 我在这里找到了那个描述,但它很短。

  • 然后我尝试在我的Windows计算机上使用gcc.exe和g++.exe进行实验:

    1
    2
    3
    4
    5
    $ 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个简单的测试文件,它对我来说是正确的扩展,适合语言的扩展。

    1
    2
    3
    4
    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编译器集合"工具时:

    1
    2
    $ 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]
  • 但这一个仍然没有错误

    1
    $ gcc -x c++ -std=c++98 test_cpp.c
  • 而且这也

    1
    $ g++ -std=c++0x test_cpp_11.cpp
  • 测试文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    $ 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可以作为metatool正常工作- STD -X标志。看到这个


  • "gcc"是GNU编译器集合的常用缩写词。这既是编译器最通用的名称,也是在重点编译C程序时使用的名称(以前的缩写是"GNUCcompiler")。

    在引用C++编译时,通常调用编译器"g++"。由于只有一个编译器,所以无论语言环境如何,都可以称之为"GCC";然而,在编译C++程序时,术语"G++"更有用。

    你可以在这里读更多。


    我在Linux系统中测试gcc和g++。通过使用makefile,我可以定义"gnu make"使用的编译器。我使用"C Plus"的所谓"动态内存"定位功能通过以下方式进行了测试:

    1
    2
    3
    4
    5
    6
    7
    8
    int main(){

    int * myptr = new int;
    * myptr = 1;
    printf("myptr[0] is %i
    "
    ,*myptr);
    return 0;
    }

    只有g++可以在我的计算机上成功编译,而gcc将报告错误

    1
    undefined reference to `operator new(unsigned long)'

    所以我自己的结论是GCC并不完全支持"C+plus"。对于C++源文件来说,选择G++是一个更好的选择。


    gcc和g++都是GNU编译器。他们都编译C和C++。不同之处在于*.C文件GCC将它视为C程序,G++将其视为C++程序。*.CPP文件被认为是C++程序。C++是一个超级集合的C,语法更严格,所以要小心后缀。