Visual C ++和gcc一样强大吗?

时间:2010-06-24 06:35:27

标签: c++ c visual-c++ gcc

我对强大的定义是定制的能力。

我熟悉gcc我想尝试MSVC。所以,我在msvc中搜索gcc等效选项。我找不到其中很多。

控制输出类型

Stop after the preprocessing stage; do not run the compiler proper.
gcc: -E
msvc: ???

Stop after the stage of compilation proper; do not assemble.
gcc: -S
msvc: ???

Compile or assemble the source files, but do not link.
gcc: -c
msvc:/c

用于调试

Print (on standard error output) the commands executed to run the stages of compilation.
gcc: -v
msvc: ???

Store the usual “temporary” intermediate files permanently;
gcc: -save-temps
msvc: ???
  1. 是否有某种gcc< - > msvc编译器选项映射指南?
  2. gcc Option Summary在每个部分中列出的选项多于Compiler Options Listed by Category。 msvc中缺少许多重要且有趣的东西。我错过了什么,或者msvc的功能真的不如gcc。

3 个答案:

答案 0 :(得分:26)

MSVC是一个IDE,gcc只是一个编译器。 CL(MSVC编译器)可以从gcc的角度执行您描述的大多数步骤。 CL /?提供帮助。

E.g。

stdout的预处理:

CL /E

无需链接编译:

CL /c

生成程序集(与gcc不同,这不会阻止编译):

CL /Fa

CL实际上只是一个编译器,如果你想看看IDE生成什么命令来编译和链接最简单的事情来查看IDE中项目的属性页面的命令行部分。 CL不会调用单独的预处理程序或汇编程序,因此没有单独的命令可供查看。

对于-save-temps,IDE会执行单独的编译和链接,因此无论如何都会保留目标文件。要保留预处理器输出和汇编器输出,您可以通过IDE启用/P/Fa

gccCL不同但我不会说MSVC缺乏“很多东西”,当然也不是你要找的输出。

答案 1 :(得分:10)

对于-E的等价物,cl.exe具有/P(它不会“在预处理阶段后停止”,但它会将预处理器输出输出到文件,这在很大程度上是相同的。)

对于-S,它有点模糊,因为“编译”和“组装”步骤发生在多个地方,具体取决于您指定的其他选项(例如,如果您有整个程序打开优化,直到链接阶段才生成机器代码。

对于-v,Visual C ++与GCC不同。它直接在cl.exe(和link.exe)中执行编译的所有阶段,因此没有“命令执行”显示。类似的-save-temps:因为一切都发生在cl.exe和link.exe中,所以唯一的“临时”文件是cl.exe生成的.obj文件,无论如何它们总是被保存。

但最终,GCC是一个开源项目。这意味着任何有痒痒的人都可以添加他们喜欢的命令行选项,但阻力相对较小。对于商业闭源产品Visual C ++,每个选项都需要有商业案例,设计会议,测试计划等。 Every new feature starts with minus 100 points

答案 2 :(得分:3)

两个编译器都有很多选项可以修改......所有内容。我怀疑任何一种选项中都没有的选项是首先不值得做的事情。大多数“正常”用户无论如何都找不到大多数这些选项的用途。

如果您纯粹关注可用选项的数量作为“权力”或“灵活性”的衡量标准,那么您可能会发现gcc成为赢家,因为gcc处理Windows以外的许多平台并具有特定功能很明显在MSVC中找不到的许多平台的选项。 gcc(嗯,gcc工具链)也编译了C和C ++之外的许多语言;我最近将它用于Objective-C,例如。

编辑:我和Dean一起质疑你问题的有效性。是的,MSVC(cl)有相当于许多gcc选项的选项,但不是,选项的数量并没有多大意义。

简而言之:除非你正在做一些非常特别的事情,否则你会发现MSVC在Windows平台上很容易“足够强大”,你可能不会错过任何gcc选项。