C++ 编译器差异 [已关闭]

问题描述 投票:0回答:6

VC++.net编译器(cl.exe /EHsc)和GCC编译器有什么区别,编译来说,就说这个程序:

#include <iostream>
using namespace std;

int main(){
 unsigned int test;
 cin >> test;
 cout << test;
 return 0;
}

我知道vc++编译器编译成exe,gcc编译成linux可执行文件,仅此而已。但真正的区别是什么?

编辑:我将差异降至较低水平。让我说得更清楚一些。同一个程序在同一平台上用2个不同的C++编译器编译有什么区别(win或linux没关系)。

c++
6个回答
8
投票

GCC 的意思是GNU 编译器集合,它是编译器和链接器集合的前端。 编译 C++ 时通常会调用 g++。

至于 g++ 与 VC++,它们是完全不同的编译器,因此存在很多差异。

例如,他们会以不同的方式优化代码,由于不正确遵循标准、不同的库、不同的标头、不同的实现等,他们可能会存在细微的语法差异...

g++可以用来编译各种不同平台上的项目,而VC++只能编译Windows平台的程序。


1
投票

我认为,不同的运行时库。


0
投票

G++ 无法编译 .net 代码(因为你提到了 VC++.net)。

它们是完全不同的,因为它们是由具有不同理念的不同群体开发的。


0
投票

编译器之间的差异太多,无法在 SO 答案中全面编写,但这里有一些:

  1. 我假设您正在将 msvc 与 mingw32 gcc 进行比较(两者都可以生成 win32 可执行文件)。 msvc 有不同的链接器选项(MT、MD、ML、LD),它们将可执行文件链接到运行时的共享/静态和线程/非线程版本,包括 stdc++ 运行时。 MinGW (gcc) 静态或动态链接到它自己的运行时 libgcc* 以及它的 libstdc++。 MinGW 还将链接到 Windows 的 msvcrt.dll 及其中的函数,但需要提供一些更多静态链接的功能,从而导致二进制文件更大一些。如果您要将 Linux gcc 与 Windows msvc 进行比较,请阅读 PE 和 ELF 文件格式。

  2. 优化例程完全不同。阅读文档中的内容

  3. 后端工具完全不同; MSVC 使用(其中包括 masm、link、cl),而 gcc 使用 gcc、g++、cc1、cc1plus(和 binutils)等内容。

  4. 异常处理:MSVC是异常处理类型的创建者,因此它自然有“最佳”的处理方式。 GCC/MinGW 正在迎头赶上,希望 4.6 版本将具有结构化异常处理(正在进行中)。

还有很多很多,但我现在能想到的就这些了。


0
投票

GCC 会将源代码编译并链接为 ELF 格式和其他格式(请参阅我的答案的注释),而 VC++ 将以 PE 格式编译和链接。

** 编辑我的错误,GCC 也会在 Windows 的 PE 格式下编译。 我忘记了


0
投票

您可以通过查看编译器生成的汇编器来准确了解编译器生成的内容。
在 VC++ 或 gcc -S 上使用 /FA 进行编译

© www.soinside.com 2019 - 2024. All rights reserved.