直到今天,我总是在互联网上阅读gcc如何成为C语言的最佳编译器(至少对于学生的编程水平,紧随其后的是Clang)。
然而在“21st Century C”中,Ben Klemens先生建议c99比运行gcc -std=c99
更好(?)(实际行是[第11页]:其他人切换到C99是默认的长
之前 ...)
我无法找到关于c99编译器主题的任何内容,所以我的问题是:
这些命令之间是否存在差异?如果有,哪一个更好?
编辑:该段落中明确提到了标准C99,但从一开始建议的编译方法就是命令:
gcc erf.c -o erf -lm -g -Wall -O3 -std=gnu11
然而,在第11页,作者说:
POSIX标准指定c99存在于您的系统上,因此 上述行的编译器无关的版本将是:
c99 erf.c -o erf -lm -g -Wall -O3
这似乎表明这两个命令存在差异。我无法找到任何其他信息,也没有从文本中清楚地知道,第二行是什么(我的Cygwin上没有c99的手册页)。
答案 0 :(得分:2)
C99是1999年版的ISO C标准。它取代了1990年的标准,并且(正式地,至少)被2011年标准取代。
你所询问的是c99
命令(我已更新你的问题标题以澄清这一点。)
POSIX指定c99
命令。要求记录在案here。它是“标准C编译系统的接口”。
在典型的Linux系统上,c99
命令/usr/bin/c99
是一个调用gcc
命令的小shell脚本。它使用gcc
选项调用-std=c99
。它还会检查用户是否已指定了等效选项,因此它不会使用相同的选项两次。如果给出了不兼容的选项,例如c99 -std=c90
,则会以错误消息终止。
鉴于这样的实现,命令
c99 [args]
完全等同于
gcc -std=c99 [args]
正如我上面提到的,C99标准已经被C11标准正式取代。 gcc版本5(当前最新版本是5.3.1)具有相当好的支持,但不是100%完全支持C11。 POSIX尚未(尚未)指定c11
命令。
如果您不需要特定于C11的功能,则使用C99标准没有任何问题 - 如果您不需要C99特定功能,甚至不需要C90标准。
答案 1 :(得分:1)
在本书的PDF副本中,有关使用c99
而不是gcc -std=c99
的讨论似乎是在第10页,而不是第11页。
正在讨论的内容并不是c99
比gcc
“更好”,而是您可以通过c99
命令更轻松地使用C99标准编译器功能,因为您不需要知道启用C99功能的特定选项,或者编译器的默认值是C99还是C89。
在我的系统上,命令c99
只是gcc
的别名或链接,默认设置为-std=c99
(并且如果指定了非C99标准,则会发出抱怨) -std=
选项)。我想在大多数使用c99
编译器命令的系统上都有类似的东西。
实际上,在我的系统c99
上是一个指向shell脚本的链接:
#! /bin/sh
# Call the appropriate C compiler with options to accept ANSI/ISO C
# The following options are the same (as of gcc-3.3):
# -std=c99
# -std=c9x
# -std=iso9899:1999
# -std=iso9899:199x
extra_flag=-std=c99
for i; do
case "$i" in
-std=c9[9x]|-std=iso9899:199[9x])
extra_flag=
;;
-std=*|-ansi)
echo >&2 "`basename $0` called with non ISO C99 option $i"
exit 1
;;
esac
done
exec gcc $extra_flag ${1+"$@"}
答案 2 :(得分:0)
在典型的Linux机器上试试c99 --version
。您将获得编译器的版本和名称gcc
。
c99
只是您计算机上符合c99标准的编译器的快捷方式。这样你就不必关心所使用的实际编译器。 POSIX还需要编译器必须了解的一些常用命令行选项。如果是gcc,则应启用符合c99的功能。这应该与gcc -std=c99
相同。
gcc提供了其他功能,默认情况下[1]在通过其本机名称调用时启用,除了CXX标准外,还通过-std=gccXX
选项启用。对于旧版本,其中一些扩展直接或略有不同的语法成为下一个C标准的一部分。 C90的典型和受欢迎的扩展是对C ++风格的行注释的支持:
// this is not allowed in pure C90
对于c99 / gnu99,事情不那么明显,但可能仍会添加一些有用的功能。
在其他POSIX系统上,例如Unix,你可能会发现一个不同的编译器。它仍然可以通过名称c99
获得。
请注意,自2011年以来,当前且唯一有效的C标准是C11。因此,如果要使用新功能(例如原子,线程支持),则必须偏离纯POSIX路径。但有一天POSIX可能会更新。
[1] C标准的默认版本取决于gcc的版本。 pre5使用C90,而gcc 5.x使用C11。