题
g++ 和 gcc 有什么区别?一般 C++ 开发应该使用哪些?
其他提示
海湾合作委员会:GNU 编译器集合
- GNU 编译器支持的所有不同语言的引用。
海湾合作委员会:GNU C 编译器
克++:GNU C++ 编译器
主要区别:
- gcc 将编译:*.c/*.cpp 文件分别为 C 和 C++。
- g++ 将编译:*.c/*.cpp 文件,但它们都将被视为 C++ 文件。
- 此外,如果您使用 g++ 链接目标文件,它会自动链接到 std C++ 库(gcc 不这样做)。
- gcc 编译 C 文件的预定义宏较少。
- 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 Compiler”演变而来的。成为多语言“GNU编译器集合”。术语“GNU C编译器”是指“GNU C编译器”。在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 ++的链接 图书馆。它将.c,.h和.i文件视为C ++源文件而不是 C源文件,除非使用-x。这个程序在使用时也很有用 预编译带有.h扩展名的C头文件,以便在C ++中使用 汇编
搜索 gcc
手册页,了解有关 gcc
和 g ++
的选项差异的详细信息。
哪一个应该用于一般的c ++开发?
从技术上讲, gcc
或 g ++
可用于具有适用选项设置的常规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 ++开发。
我对这个问题感兴趣并进行了一些实验
-
我在这里找到了相关说明,但它很短。
-
然后我尝试在我的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
-
我尝试编译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
-
但是当我尝试运行“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]
-
但是这个仍然没有错误
$ gcc -x c++ -std=c++98 test_cpp.c
-
这也是
$ g++ -std=c++0x test_cpp_11.cpp
醇>
-
如果查看进程树,那么gcc和g ++似乎是其他工具的后端,在我的环境中是: cc1plus.exe,cc1.exe,collect2.exe,as.exe, ld.exe
-
如果您有正确的扩展名或设置正确,gcc可以正常使用metatool -std -x标志。请参见此
醇>
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;
}
<强>调查结果:强>
&#8220; GCC&#8221;是GNU编译器集合的常用简写术语。这是编译器的最通用名称,以及强调编译C程序时使用的名称(正如以前的缩写代表&#8220; GNU C编译器&#8221;)。
当提到C ++编译时,通常会调用编译器&#8220; G ++&#8221;。由于只有一个编译器,因此调用它也是准确的&#8220; GCC&#8221;无论语言背景如何;然而,术语&#8220; G ++&#8221;当重点是编译C ++程序时,它会更有用。
您可以阅读更多此处一>
我在linux系统中测试gcc和g ++。通过使用MAKEFILE,我可以定义“GNU make”使用的compliler。我用所谓的“动态记忆”进行了测试。定位“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”。 似乎选择g ++ for C ++源文件是一个更好的选择。
gcc和g ++都是GNU编译器。他们都编译c和c ++。区别在于* .c文件gcc将其视为c程序,g ++将其视为c ++程序。 * .cpp文件被认为是c ++程序。 c ++是c的超集,语法更严格,所以要小心后缀。