“与”之间的区别是什么;c99“;及;gcc“;具有适当标志的命令?
直到今天,我一直在网上读到gcc是C最好的编译器(至少对于学生级的编程来说,紧随其后的是Clang)。 然而,在“”中,Ben Klemens先生建议c99比运行“与”之间的区别是什么;c99“;及;gcc“;具有适当标志的命令?,c,gcc,c99,C,Gcc,C99,直到今天,我一直在网上读到gcc是C最好的编译器(至少对于学生级的编程来说,紧随其后的是Clang)。 然而,在“”中,Ben Klemens先生建议c99比运行gcc-std=c99更好(?)(实际行是[第11页]:其他所有人都切换到c99,这是长时间的默认值 很久以前……) 我找不到任何关于c99编译器的主题,所以我的问题是: 这些命令之间有什么区别吗?如果有,哪一个更好 编辑:本段中明确说明了标准C99,但从一开始,建议的编译方法是命令: gcc erf.c -o erf -lm -g
gcc-std=c99更好(?)(实际行是[第11页]:其他所有人都切换到c99,这是长时间的默认值
很久以前……)
我找不到任何关于c99编译器的主题,所以我的问题是:
这些命令之间有什么区别吗?如果有,哪一个更好
编辑:本段中明确说明了标准C99,但从一开始,建议的编译方法是命令:
gcc erf.c -o erf -lm -g -Wall -O3 -std=gnu11
然而,在第11页,提交人说:
POSIX标准指定c99出现在您的系统上,因此
上述行的编译器不可知版本为:
这似乎表明这两个命令之间存在差异。我找不到任何其他信息,也不清楚第二行到底是什么(在我的Cygwin上也没有c99的手册页)。在典型的Linux机器上尝试c99--version
。您将获得编译器的版本和名称,即gcc
c99
只是计算机上兼容c99编译器的快捷方式。这样,您就不必关心实际使用的编译器。POSIX还需要一些编译器必须理解的通用命令行选项。如果是gcc,则应启用c99兼容功能。这应该与gcc-std=c99相同
除了CXX标准外,gcc还提供了默认情况下由其本机名称和-std=gccXX
选项调用时启用的附加功能[1]。对于较旧的版本,其中一些扩展直接或使用稍微不同的语法成为下一个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,而GCC5.x使用C11。在典型的Linux机器上尝试c99——版本。您将获得编译器的版本和名称,即gcc
c99
只是计算机上兼容c99编译器的快捷方式。这样,您就不必关心实际使用的编译器。POSIX还需要一些编译器必须理解的通用命令行选项。如果是gcc,则应启用c99兼容功能。这应该与gcc-std=c99相同
除了CXX标准外,gcc还提供了默认情况下由其本机名称和-std=gccXX
选项调用时启用的附加功能[1]。对于较旧的版本,其中一些扩展直接或使用稍微不同的语法成为下一个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。C99是ISO C标准的1999版。它取代了1990年的标准,并且(至少是官方的)被2011年的标准所取代
不过,您要问的是c99
命令(我更新了您问题的标题以澄清这一点)
POSIX指定一个c99
命令。这些要求被记录下来。它是“标准C编译系统的接口”
在典型的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标准也没有错。C99是ISO C标准的1999版。它取代了1990年的标准,并且(至少是官方的)被2011年的标准所取代
不过,您要问的是c99
命令(我更新了您问题的标题以澄清这一点)
POSIX指定一个c99
命令。这些要求被记录下来。它是“标准C编译系统的接口”
在典型的Linux系统上,c9
#! /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+"$@"}