Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;那么gcc呢?_C++_Gcc_G++ - Fatal编程技术网

C++ g++;那么gcc呢?

C++ g++;那么gcc呢?,c++,gcc,g++,C++,Gcc,G++,g++和gcc之间的区别是什么?其中哪一个应该用于一般C++开发? < P>代码> GCC < /C>和 G++< /Cord>是GNU编译器集合的编译器驱动程序(Gnu编译器集合(它曾经是GNUC编译器)。 即使它们根据文件类型自动确定要调用哪些后端(cc1cc1plus..),除非使用-x语言重写,否则它们也存在一些差异 默认设置中最重要的区别可能是它们自动链接到哪些库 根据GCC的在线文档和,g++相当于GCC-xc++-lstdc++-shared libgcc(第一个是编译器选项,第二

g++和gcc之间的区别是什么?其中哪一个应该用于一般C++开发?

< P>代码> GCC < /C>和 G++< /Cord>是GNU编译器集合的编译器驱动程序(Gnu编译器集合(它曾经是GNUC编译器)。

即使它们根据文件类型自动确定要调用哪些后端(
cc1
cc1plus
..),除非使用
-x语言
重写,否则它们也存在一些差异

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


根据GCC的在线文档和,
g++
相当于
GCC-xc++-lstdc++-shared libgcc
(第一个是编译器选项,第二个是链接器选项)。这可以通过使用>V选项(它显示正在运行的后端工具链命令)来检查。

< P> C++,您应该使用G++/P> 它是同一个编译器(例如GNU编译器集合)。GCC或G++只需选择具有不同默认选项的不同前端


简而言之:如果使用G++,前端将告诉链接器,您可能希望与C++标准库链接。gcc前端不会这样做(如果您传递正确的命令行选项,它也可以与它们链接)

一个显著的区别是,如果将
.c
文件传递给gcc,它将编译为c


<> P+>默认的G++行为是对待C++,C~(/Cuth.>)文件作为C++(除非<代码> -x c>代码>。< /P> < P>尽管GCC和G+命令做了非常类似的事情,但是G++被设计为调用C++程序的命令;它的目的是自动做正确的事情


在幕后,他们其实是同一个节目。据我所知,这两个都决定是否根据文件扩展名编译C或C++程序。两者都可以链接到C++标准库,但默认情况下只有G++才这样做。因此,如果你有一个C++程序,不需要链接到标准库,GCC会碰巧做正确的事情。但是,g++也是如此。所以没有理由不使用G++来进行一般的C++开发。
  • 引用GNU编译器支持的所有不同语言
gcc
:GNU C编译器
<代码> g++< /> >:GNU C++编译器

主要区别是:

<>代码> GCC < /Calp>将编译:<代码> *.c*.CPP< /C>文件,分别为C和C++。 <代码> G+++ <代码>将编译:<代码> *.c*.CPP< /Cord>文件,但它们都将被视为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
    

    “GCC”是GNU编译器集合的常用速记词。这既是编译器最通用的名称,也是强调编译C程序时使用的名称(以前的缩写是“GNUC编译器”)

    在引用C++编译时,通常调用编译器“g++”。因为只有一个编译器,所以无论语言环境如何,将其称为“GCC”都是准确的;然而,当强调编译C++程序时,“G++”一词更有用。


    您可以阅读更多内容。

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

    < P> <强>我对这个问题感兴趣,并进行了一些实验<强/< /P>
  • 我找到了那个描述,但它很短

  • 然后,我尝试在我的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 
    
  • p、 美国测试文件

    $ 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;
    }
    
    $cat test\u c89.c test\u c99.c test\u cpp.cpp
    //C89兼容文件
    int main()
    {
    int x[]={0,2};
    返回大小f(x);
    }
    //C99兼容文件
    int main()
    {
    int x[]={[1]=2};
    返回大小f(x);
    }
    //C++19982003兼容文件
    类X{};
    int main()
    {
    X;
    返回大小f(x);
    }
    //C++11
    #包括
    枚举类颜色:int{red,green,blue};//作用域枚举
    int main()
    {
    std::vector a{1,2,3};//括号初始化
    返回0;
    }
    
    调查结果:

  • 如果查看进程树,那么gcc和g++似乎是其他工具的后端,在我的环境中是:cc1plus.exe、cc1.exe、collect2.exe、as.exe、ld.exe

  • 如果您有正确的扩展名或设置正确,gcc可以作为元工具很好地工作 -std-x标志。看


  • g++和gcc之间有什么区别?

    gcc
    已从单一语言的“GNU C编译器”演变为多语言的“GNU编译器集合”。术语“GNUC编译器”有时仍在C编程环境中使用

    <代码> G++< /Cord>是GNU编译器集合的C++编译器。与

    gnat
    类似,gnat是
    gcc
    的Ada编译器

    例如,ubuntu16.04和18.04
    mang++
    命令返回
    GCC(1)
    
    int main(){
    
    int * myptr = new int;
    * myptr = 1;
    printf("myptr[0] is %i\n",*myptr);
    return 0;
    }
    
    undefined reference to `operator new(unsigned long)'