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

What is the difference between g++ and gcc?

本文关键字:什么 区别 之间 gcc g++      更新时间:2023-10-16

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

gccg++是GNU编译器集合的编译器驱动程序(它曾经只是GNU编译器)。

尽管它们会根据文件类型自动确定要调用哪些后端(cc1 cc1plus…),但除非用-x language重写,否则它们会有一些差异。

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

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

默认情况下(与gcc不同),g++还添加了链接器选项-lm-来链接包含math.h实现的libm

GCC:GNU编译器集合

  • 指GNU编译器支持的所有不同语言

gcc:GNU C编译器
g++:GNU C++编译器

主要区别:

  1. gcc将把*.c*.cpp文件分别编译为C和C++
  2. g++将编译:*.c*.cpp文件,但它们都将被视为C++文件
  3. 此外,如果使用g++链接对象文件,则它会自动链接到std C++库中(gcc不执行此操作)
  4. 编译C文件的gcc具有较少的预定义宏
  5. gcc编译*.cppg++编译*.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前端不会这么做(如果您传递正确的命令行选项,它也可以与它们链接)。

g++gcc之间有什么区别

CCD_ 29已经从单一语言";GNU C编译器";成为一种多语言";GNU编译器集合";。术语CCD_;GNU C编译器";在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 man g++命令返回GCC(1)手册页。

Ubuntu 16.04和18.04 man gcc声明。。。

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

并且默认。。。

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

有关gccg++之间选项差异的更多详细信息,请搜索gcc手册页。

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

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

Ubuntu 18.04的"gcc"手册页添加了,Ubuntu 20.04继续有以下段落:

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


旁注:在Xcode.app嵌入式工具链的情况下,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++

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

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

尽管gcc和g++命令做的事情非常相似,但g++被设计成编译C++程序时需要调用的命令;它旨在自动做正确的事情。

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

我对这个问题感兴趣,并进行了一些实验

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

  2. 然后我试着在我的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
    
  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
    
  4. 但当我尝试以这种方式运行"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]
    
  5. 但这一个仍然工作没有错误

    $ gcc -x c++ -std=c++98 test_cpp.c
    
  6. 这也是

    $ 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;
}

调查结果:

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

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

"GCC"是GNU编译器集合的常用缩写术语。这既是编译器最通用的名称,也是强调编译C程序时使用的名称(缩写以前代表"GNU C编译器")。

当提到C++编译时,通常将编译器称为"G++"。由于只有一个编译器,因此无论语言上下文如何,将其称为"GCC"也是准确的;然而,当重点是编译C++程序时,术语"G++"更有用。

你可以在这里阅读更多。

我在linux系统中测试gcc和g++。通过使用MAKEFILE,我可以定义"GNU make"使用的编译器。我测试了所谓的"动态内存"定位功能的"C++"通过:

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

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

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的超级集合,语法更严格,所以要小心后缀。