带有适当标志的“c99”和“gcc”命令有什么区别?

时间:2016-01-09 22:11:12

标签: c gcc c99

直到今天,我总是在互联网上阅读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的手册页)。

3 个答案:

答案 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页。

正在讨论的内容并不是c99gcc“更好”,而是您可以通过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。