Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“与”之间的区别是什么;c99“;及;gcc“;具有适当标志的命令?_C_Gcc_C99 - Fatal编程技术网

“与”之间的区别是什么;c99“;及;gcc“;具有适当标志的命令?

“与”之间的区别是什么;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是C最好的编译器(至少对于学生级的编程来说,紧随其后的是Clang)。 然而,在“”中,Ben Klemens先生建议c99比运行
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+"$@"}