gcc和g++/gcc-c++有什么区别?

32

在我看来,gcc可以处理c和c++项目,那么为什么还需要g++/gcc-c++呢?

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


1
gcc-c++ 看起来不是标准的编译器名称,至少现在不是。通过谷歌搜索,我发现这个问题是包含该字符串的顶部链接,而唯一的其他链接是在 rpmfind.net 上列出的一个软件包。所以我不知道它到底是什么... 可能只是一个符号链接。 - andybuckley
1
可能是What is the difference between g++ and gcc?的重复问题。 - Romain Vincent
2个回答

59

gcc会根据文件扩展名将C源代码文件编译为C,将C++源代码文件编译为C++。但是它不会自动链接C++库。

g++将自动包含C++库;默认情况下,它也会将扩展名指示为C源代码的文件编译为C++,而不是C。

来自http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html#Invoking-G_002b_002b

C++源代码通常使用以下后缀之一:.C, .cc, .cpp, .CPP, .c++, .cp, 或 .cxx;C++头文件通常使用 .hh, .hpp, .H, 或(用于共享模板代码).tcc;预处理的C++文件使用后缀.ii。GCC识别具有这些名称的文件,并将它们编译为C++程序,即使您像编译C程序一样调用编译器(通常使用gcc命令)。

然而,使用gcc不会添加C++库。g++是调用GCC的程序,并将.c.h.i文件视为C++源文件而不是C源文件(除非使用了-x选项),并自动指定链接到C++库。当预编译带有.h扩展名的C头文件以供C++编译时,此程序也很有用。

例如,要编译一个简单的C++程序,该程序向std::cout流写入内容,可以使用以下任意一种方式(在Windows上使用MinGW):

  • g++ -o test.exe test.cpp
  • gcc -o test.exe test.cpp -lstdc++

但是如果我尝试这样做:

  • gcc -o test.exe test.cpp

我会在链接时得到未定义的引用错误。

至于另一个差异,以下的C程序:

#include <stdlib.h>
#include <stdio.h>

int main() 
{
    int* new;
    int* p = malloc(sizeof(int));

    *p = 42;
    new = p;

    printf("The answer: %d\n", *new);

    return 0;
}

使用以下命令编译和运行都没有问题:

  • gcc -o test.exe test.c

但如果使用以下命令进行编译,则会产生多个错误:

  • g++ -o test.exe test.c

错误信息:

test.c: In function 'int main()':
test.c:6:10: error: expected unqualified-id before 'new'
test.c:6:10: error: expected initializer before 'new'
test.c:7:32: error: invalid conversion from 'void*' to 'int*'
test.c:10:9: error: expected type-specifier before '=' token
test.c:10:11: error: lvalue required as left operand of assignment
test.c:12:36: error: expected type-specifier before ')' token

7
因为它使用了 "new" 作为变量名,呵呵。 - DragonLord
2
什么样的程序员会将“new”用作变量名?更让我惊讶的是,你是如何使用gcc成功编译这个可怕的代码的... - JohnJohn
2
@JohnJohn 这只是有效的 C 代码示例(但无效的 C++ 代码),这就是为什么 gcc 可以编译它。 - Marc.2377

0
据我所知,g++使用正确的C++链接器选项,而gcc使用C链接器选项(因此您可能会遇到未定义的引用等问题)。

@gdb:有趣,我通常会遇到问题,不过我猜你可能通过手动传递正确的标志来解决了它们。 - user541686
可能。此外,g++和gcc-c++有什么区别? - gdb
@gdb:我有点困惑……这不是你最初的问题吗? - user541686

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接