我对强大的定义是定制的能力。
我熟悉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: ???
答案 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
。
gcc
和CL
不同但我不会说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选项。