编译后停止和仅检查语法之间的区别

Orw*_*ell 2 c c++ gcc g++ syntax-checking

当使用gcc或g ++时,告诉GCC只编译文件而不是链接(-S),并告诉它不生成输出文件(-o"nul")之间有什么区别:

gcc.exe/g++.exe -S "filename" -o "nul"
Run Code Online (Sandbox Code Playgroud)

...并告诉它只检查语法(-fsyntax-only)?

gcc.exe/g++.exe -c "filename" -fsyntax-only
Run Code Online (Sandbox Code Playgroud)

这两个选项都不会产生输出,只运行编译阶段,并且需要大约相同的时间才能运行.

我正在使用GCC的Windows端口,它将"nul"视为占用所有输出的空设备(如/ dev/null).

编辑:正如Mike Seymour所指出的,当将-fsyntax-only传递给GCC时,即使被告知这样做也不会尝试执行优化,这与-S不同.换句话说,这是较慢的(我已经执行了测量):

gcc.exe -S "filename" -o "nul" -O3
Run Code Online (Sandbox Code Playgroud)

... 比这个:

gcc.exe -c "filename" -fsyntax-only -O3
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 5

第一个确实以装配的形式产生输出,因为这是做什么的-S; 然后你扔掉输出.(假设这是"nul"你平台上的写法意思;我原本希望它写入一个名为的文件"nul".)

结果类似于第二个,但更多的工作(编译和生成程序集),并没有真正表达检查语法的意图.代码生成和优化期间的额外静态分析可能会产生额外的警告,仅在检查语法时会丢失.

  • 实际上,我相信gcc用`-S`检测到一些错误,它不能用`-fsyntax-only'检测到,所以结果并不严格相同.那些错误可能不严格是语法错误,我不记得了. (2认同)