g ++ 和 gcc 有什么区别?

g ++ 和 gcc 有什么区别?通用 c ++ 开发应使用其中哪一个?

答案

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

即使它们根据文件类型自动确定要调用的后端( cc1 cc1plus ...),除非用-x language覆盖,它们还是有一些区别。

它们默认值之间最重要的区别是它们自动链接到的库。

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

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. gcc 编译 C 文件具有较少的预定义宏。
  5. 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 前端不会这样做(如果您传递了正确的命令行选项,它也可以与它们链接)。

g++gcc什么区别?

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

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几乎相同的选项

而默认...

... 使用gcc不会添加 C ++ 库。 g++是一个调用 GCC 并自动指定针对 C ++ 库的链接的程序。除非使用 - x,否则它将. c,.h 和. i 文件视为 C ++ 源文件而不是 C 源文件。当预编译带有. h 扩展名的 C 头文件以用于 C ++ 编译时,该程序也很有用。

搜索gcc更多细节手册页的选项之间方差gccg++

通用 c ++ 开发应使用哪一个?

从技术上讲,可以使用gccg++通过适用的选项设置进行常规 C ++ 开发。但是, g++默认行为自然符合 C ++ 开发。

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

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

唯一值得注意的区别是,如果将.c传递给 gcc,它将编译为 C,而 g ++ 始终将其视为 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

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

发现:

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

  2. 如果您具有正确的扩展名或设置了正确的 - std -x 标志,gcc 可以很好地用作 metatool。看到这个

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

当涉及到 C ++ 编译时,通常将编译器称为 “G ++”。由于只有一个编译器,因此无论什么语言环境,都将其称为 “GCC” 也很准确。但是,当重点放在编译 C ++ 程序时,术语 “G ++” 更有用。

您可以在这里阅读更多内容。

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

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*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 将其视为 ac 程序,而 g ++ 则将其视为 ac ++ 程序。 * .cpp 文件被认为是 c ++ 程序。 c ++ 是 c 的超集,并且语法更加严格,因此请注意后缀。