【发布时间】:2011-08-16 18:08:14
【问题描述】:
在我看来gcc可以同时处理c和c++项目,那么为什么需要g++/gcc-c++呢?
g++和gcc-c++有什么区别?
【问题讨论】:
-
gcc-c++ 似乎不是标准的编译器名称,至少现在是这样。谷歌搜索,我得到这个问题作为实际包含该字符串的顶部链接,唯一的另一个是 rpmfind.net 上列出的包。所以我不知道它是什么......可能只是一个符号链接。
在我看来gcc可以同时处理c和c++项目,那么为什么需要g++/gcc-c++呢?
g++和gcc-c++有什么区别?
【问题讨论】:
据我所知,g++ 使用正确的 C++ 链接器选项,而 gcc 使用 C 链接器选项(因此您可能会得到未定义的引用等)。
【讨论】:
gcc 会将 C 源文件编译为 C,如果文件具有适当的扩展名,则将 C++ 源文件编译为 C++;但是它不会自动链接到 C++ 库中。
g++ 将自动包含 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++ 编译时也很有用。
例如,要编译一个写入std::cout 流的简单 C++ 程序,我可以使用任一(Windows 上的 MinGW):
但如果我尝试:
我在链接时得到未定义的引用。
对于另一个区别,以下 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;
}
编译并运行良好:
但使用编译时会出现几个错误:
错误:
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
【讨论】: