g ++和gcc有什么区别?

g ++和gcc有什么区别? 哪些应该用于一般的c ++开发?

gccg++是“Gnu编译器集合 ”的编译器驱动程序(曾经是“Gnu C编译器 ”)。

即使它们自动确定根据文件types调用哪个后端( cc1 cc1plus …),除非用-x language覆盖,它们有一些差异。

它们的默认值可能最重要的区别是它们自动链接的库。

根据[1]和[2] , 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文件的预定义macros较less。
  5. gcc编译* .cpp和g ++编译* .c / *。cpp文件有一些额外的macros。

编译* .cpp文件时额外的macros:

 #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 ++只是select不同的默认选项不同的前端。

简而言之,如果您使用g ++,前端会告诉链接器您可能想要链接到C ++标准库。 gcc前端不会这样做(如果你传递正确的命令行选项,也可以和它们链接)。

尽pipegcc和g ++的命令做了非常相似的事情,但是g ++被devise成你要编译C ++程序的命令; 它的目的是自动做正确的事情。

在幕后,他们真的是同一个节目。 据我所知,这两个决定是否编译程序为C或C + +基于文件扩展名。 两者都能够链接到C ++标准库,但只有g ++默认这样做。 所以,如果你有一个用C ++编写的程序,不需要和标准库链接,gcc就会做正确的事情; 但是,那么g ++也是如此。 所以没有理由不使用g ++来进行一般的C ++开发。

“GCC”是GNU Compiler Collection的常用术语。 这是编译器最通用的名称,也是编译C程序时使用的名称(以前的缩写代表“GNU C编译器”)。

引用C ++编译时,通常会调用编译器“G ++”。 由于只有一个编译器,因此无论语言环境如何,将其称为“GCC”也是准确的。 然而,当强调编译C ++程序时,术语“G ++”更为有用。

你可以在这里阅读更多。

我对这个问题产生了兴趣并进行了一些实验

  1. 我在这里find了描述,但是很短。

  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简单的testing文件,而且对于我来说正确的扩展匹配语言

     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 compiler collection”工具时:

     $ 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 

pstesting文件

 $ 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可以正常工作。 看到这个

唯一显着的区别是,我将.c传递给gcc它将编译为C,而g ++将始终将它视为C ++

g++gcc什么区别?

gcc已经从单一语言“GNU C编译器”发展成为一个多语言的“GNU编译器集合”。 在C编程中,“GNU C编译器”这个术语有时仍然用到。

g++ GNU编译器集合的C ++编译器。 像gnatgcc的Ada编译器。 请参阅使用GNU编译器集合(GCC)

例如在Ubuntu 16.04上, man g++返回GCC(1)手册页。

man gcc指出,…

g++主要接受与gcc相同的选项

并默认…

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

gcc手册页上查找关于gccg++的选项差异的更多细节。

哪一个应该用于一般的C ++开发?

gccg++都可以用于通用的C ++开发和适用的选项设置。 但是, g++默认行为更自然地与C ++中心开发alignment。

gcc和g ++都是GNU编译器。 他们都编译c和c ++。 不同之处在于* .c文件,gcc把它当作交stream程序,g ++把它看作是ac ++程序。 * .cpp文件被认为是c ++程序。 c ++是c的超集,而且语法比较严格,所以要注意后缀。

我正在linux系统中testinggcc和g ++。 通过使用MAKEFILE,我可以定义“GNU make”使用的编译器。 我用所谓的“dynamic内存”定位function“C plus plus”进行testing:

 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”。 看来selectg ++的C ++源文件是一个更好的select。