GCC vs G++:区别何在以及如何选择C++编译器?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:两个名字的戏剧

\n\n

如果您曾经尝试在Linux或macOS上编译C++程序,那么您肯定遇到过两个相似的命令:gcc和g++。乍一看,它们之间的区别微乎其微——两者都启动编译器,两者都能处理C和C++。但一旦选错,您就会得到一大堆链接错误,这些错误足以毁掉即使是经验丰富的开发者的夜晚。

\n\n

这个问题是Stack Overflow上最热门的问题之一(浏览量超过20万!)。新手们常常认为:“既然gcc能编译C++,那为什么还需要g++?” 但这样想就错了。今天,我们将通过真实的代码示例,一劳永逸地弄清楚其中的玄机。您将了解何时使用gcc,何时使用g++,以及如何避免陷入隐式依赖的陷阱。

\n\n

简要回顾:什么是GCC?

\n\n

GCC(GNU编译器套件)不仅仅是一个编译器,而是一整套工具。它包含用于C、C++、Fortran、Ada等语言的编译器。从历史上看,这个缩写代表“GNU C编译器”,但多年来该项目已经发展壮大。

\n\n

gcc命令是一个驱动程序,默认情况下它会启动C语言的编译器。g++命令是同一个驱动程序,但带有启用C++支持的标志。看起来是小事一桩。但正是这个“小事”决定了您的代码能否正常工作。

\n\n

主要区别:标准库的链接

\n\n

假设您编写了一个简单的C++程序:

\n\n
#include <iostream>\nint main() {\n    std::cout << "你好,世界!" << std::endl;\n    return 0;\n}\n
\n\n

我们尝试用两种方式编译它:

\n\n
gcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n
\n\n

结果:

\n
    \n
  • g++ — 编译成功。
  • \n
  • gcc — 您将得到一个链接错误 undefined reference to `std::cout'。
  • \n
\n\n

为什么?因为gcc不会自动链接libstdc++库(C++标准库)。它认为您在编译纯C语言,而C语言中没有iostream、std::string以及其他C++的便利特性。g++则会自动执行此操作。

\n\n

当然,您可以通过手动添加-lstdc++标志来强制gcc处理C++:

\n\n
gcc main.cpp -lstdc++ -o program_gcc_fixed\n
\n\n

但何必多此一举呢?g++开箱即用。

\n\n

那么编译纯C语言呢?

\n\n

这里情况是对称的。如果您编写一个C语言程序并尝试通过g++编译,它很可能会工作。但g++会将代码视为C++,这意味着:

\n
    \n
  • 更严格的类型检查。
  • \n
  • 隐式类型转换的不同规则。
  • \n
  • 可能出现误报的警告。
  • \n
\n\n

例如,C语言代码:

\n\n
#include <stdio.h>\nint main() {\n    char *s = malloc(100);\n    printf("Hello\\n");\n    free(s);\n    return 0;\n}\n
\n\n

在C语言中这是正常的。在C++中需要显式转换 (char*)malloc(100)。g++会报错,而gcc不会。结论:对于C项目使用gcc,对于C++项目使用g++。

\n\n

文件扩展名:编译器如何识别语言?

\n\n

另一个重要的细微差别:gcc和g++会查看文件扩展名。

\n\n
    \n
  • .c — 作为C语言编译。
  • \n
  • .cpp、.cc、.cxx — 作为C++编译。
  • \n
\n\n

如果您给gcc一个扩展名为.cpp的文件,它会识别出这是C++,并使用正确的前端(语言编译器)。但链接仍然会缺少

博客

书籍推荐