带有相应标志的 "c99" 和 "gcc" 命令有什么区别?
What is the difference between the "c99" and "gcc" commands with appropriate flags?
直到今天,我总是在 Internet 上读到 gcc 是最好的 C 编译器(至少对于学生级别的编程而言,紧随其后的是 Clang)。
然而,在“21st Century C”中,Ben Klemens 先生建议 c99 比 运行 gcc -std=c99
更好(?)(实际行是 [第 11 页]:其他人都切换到 C99默认为 long
前一段时间...)
我找不到关于 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
这似乎表明这 2 个命令存在差异。我找不到任何其他信息,也不清楚文本中的第二行到底是什么(我的 Cygwin 上也没有 c99 的手册页)。
在典型的 Linux 盒子上尝试 c99 --version
。您将获得编译器的版本和名称,即 gcc
.
c99
只是您机器上 c99 兼容编译器的快捷方式。这样你就不必关心实际使用的编译器。 POSIX 还需要编译器必须理解的一些常用命令行选项。如果是 gcc,它将启用 c99 兼容功能。这应该与 gcc -std=c99
.
相同
gcc 提供了额外的功能,除了 CXX 标准之外,这些功能在通过其本机名称和 -std=gccXX
选项调用时默认 [1] 启用。对于旧版本,其中一些扩展直接或使用略有不同的语法成为下一个 C 标准的一部分。 C90 的一个典型且值得赞赏的扩展是对 C++ 风格的支持 line-comments:
// this is not allowed in pure C90
对于 c99/gnu99,事情不太明显,但可能仍会添加一些有用的功能。
在其他 POSIX 系统上,例如Unix,你可能会找到不同的编译器。它仍应以名称 c99
.
提供
请注意,自 2011 年以来,当前唯一有效的 C 标准是 C11。因此,如果您想使用新功能(例如原子,thread-support),则必须偏离纯 POSIX-path.然而,POSIX 可能有一天会更新。
[1] C标准的默认版本取决于gcc的版本。 pre5 使用 C90,而 gcc 5.x 使用 C11.
C99 是 ISO C 标准的 1999 版。它取代了 1990 年的标准,并且已经(至少在官方上)被 2011 年的标准所取代。
不过,你问的是 c99
命令(我已经更新了你的问题标题以澄清这一点)。
POSIX 指定一个 c99
命令。这些要求已记录在案 here。是"an interface to the standard C compilation system".
在典型的 Linux 系统上,c99
命令 /usr/bin/c99
是一个调用 gcc
命令的小 shell 脚本。它使用 -std=c99
选项调用 gcc
。它还检查用户是否已经指定了等效选项,因此它不会两次使用相同的选项。如果给出了不兼容的选项,例如 c99 -std=c90
,它会以错误消息终止。
鉴于这样的实现,命令
c99 [args]
完全等同于
gcc -std=c99 [args]
正如我上面提到的,C99 标准已正式被 C11 标准取代。 gcc 版本 5(当前最新版本为 5.3.1)具有相当不错的支持,但对 C11 的支持不是 100%。 POSIX 尚未(尚未)指定 c11
命令。
如果您不需要特定于 C11 的功能,则使用 C99 标准没有任何问题——如果您不需要特定于 C99 的功能,则甚至可以使用 C90 标准。
在我这本书的 PDF 副本中,关于使用 c99
而不是 gcc -std=c99
的讨论似乎在第 10 页,而不是第 11 页。
并且正在讨论的不是 c99
比 gcc
"better",而是您可以更轻松地使用 C99 标准编译器功能 c99
命令,因为您不需要知道启用 C99 功能的特定选项或编译器的默认值是 C99 还是 C89。
在我的系统上,命令 c99
只是 gcc
的别名或 link,默认情况下设置了 -std=c99
(如果非C99 标准使用 -std=
选项指定)。我想在大多数使用 c99
编译器命令的系统上都是如此。
事实上,在我的系统上 c99
是 link 到 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 [=10=]` called with non ISO C99 option $i"
exit 1
;;
esac
done
exec gcc $extra_flag ${1+"$@"}
直到今天,我总是在 Internet 上读到 gcc 是最好的 C 编译器(至少对于学生级别的编程而言,紧随其后的是 Clang)。
然而,在“21st Century C”中,Ben Klemens 先生建议 c99 比 运行 gcc -std=c99
更好(?)(实际行是 [第 11 页]:其他人都切换到 C99默认为 long
前一段时间...)
我找不到关于 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
这似乎表明这 2 个命令存在差异。我找不到任何其他信息,也不清楚文本中的第二行到底是什么(我的 Cygwin 上也没有 c99 的手册页)。
在典型的 Linux 盒子上尝试 c99 --version
。您将获得编译器的版本和名称,即 gcc
.
c99
只是您机器上 c99 兼容编译器的快捷方式。这样你就不必关心实际使用的编译器。 POSIX 还需要编译器必须理解的一些常用命令行选项。如果是 gcc,它将启用 c99 兼容功能。这应该与 gcc -std=c99
.
gcc 提供了额外的功能,除了 CXX 标准之外,这些功能在通过其本机名称和 -std=gccXX
选项调用时默认 [1] 启用。对于旧版本,其中一些扩展直接或使用略有不同的语法成为下一个 C 标准的一部分。 C90 的一个典型且值得赞赏的扩展是对 C++ 风格的支持 line-comments:
// this is not allowed in pure C90
对于 c99/gnu99,事情不太明显,但可能仍会添加一些有用的功能。
在其他 POSIX 系统上,例如Unix,你可能会找到不同的编译器。它仍应以名称 c99
.
请注意,自 2011 年以来,当前唯一有效的 C 标准是 C11。因此,如果您想使用新功能(例如原子,thread-support),则必须偏离纯 POSIX-path.然而,POSIX 可能有一天会更新。
[1] C标准的默认版本取决于gcc的版本。 pre5 使用 C90,而 gcc 5.x 使用 C11.
C99 是 ISO C 标准的 1999 版。它取代了 1990 年的标准,并且已经(至少在官方上)被 2011 年的标准所取代。
不过,你问的是 c99
命令(我已经更新了你的问题标题以澄清这一点)。
POSIX 指定一个 c99
命令。这些要求已记录在案 here。是"an interface to the standard C compilation system".
在典型的 Linux 系统上,c99
命令 /usr/bin/c99
是一个调用 gcc
命令的小 shell 脚本。它使用 -std=c99
选项调用 gcc
。它还检查用户是否已经指定了等效选项,因此它不会两次使用相同的选项。如果给出了不兼容的选项,例如 c99 -std=c90
,它会以错误消息终止。
鉴于这样的实现,命令
c99 [args]
完全等同于
gcc -std=c99 [args]
正如我上面提到的,C99 标准已正式被 C11 标准取代。 gcc 版本 5(当前最新版本为 5.3.1)具有相当不错的支持,但对 C11 的支持不是 100%。 POSIX 尚未(尚未)指定 c11
命令。
如果您不需要特定于 C11 的功能,则使用 C99 标准没有任何问题——如果您不需要特定于 C99 的功能,则甚至可以使用 C90 标准。
在我这本书的 PDF 副本中,关于使用 c99
而不是 gcc -std=c99
的讨论似乎在第 10 页,而不是第 11 页。
并且正在讨论的不是 c99
比 gcc
"better",而是您可以更轻松地使用 C99 标准编译器功能 c99
命令,因为您不需要知道启用 C99 功能的特定选项或编译器的默认值是 C99 还是 C89。
在我的系统上,命令 c99
只是 gcc
的别名或 link,默认情况下设置了 -std=c99
(如果非C99 标准使用 -std=
选项指定)。我想在大多数使用 c99
编译器命令的系统上都是如此。
事实上,在我的系统上 c99
是 link 到 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 [=10=]` called with non ISO C99 option $i"
exit 1
;;
esac
done
exec gcc $extra_flag ${1+"$@"}