可以在GCC中将std = c99设置为默认值吗?

时间:2014-10-28 02:00:55

标签: c gcc c99

首先,是否可以编辑GCC命令行设置,这样我就不必每次都使用-std = c99标志进行编译?

其次,为什么c99不是默认行为?使用c99进行编译允许某些现代编程约定,例如在for循环中创建和初始化索引变量。

for(int i = 0; i < 10; i++) {...

没有c99标志,这是不可能的,我必须在自己的行上声明我认为是愚蠢的。为什么GCC默认不会使用C99编译? (正常好奇,不抱怨。请不要抨击)

感谢。

4 个答案:

答案 0 :(得分:8)

如果您真的希望每次都添加-std=c99,您可以修改所谓的&#34; spec文件&#34;这是gcc命令的配置文件。请注意,gcc命令实际上是一个编译器驱动程序,它只在较窄的意义上调用编译器(在GCC工具链的情况下,后者为cclcc1plus。)

现在修改specs文件有点棘手,因为默认情况下它只存在于gcc命令的二进制文件中。这是因为很少有人想为自己的目的修改它。

查找gcc命令尝试以这种方式查找任何规范文件的路径,

$ strace -e file gcc 2>&1 | grep specs
access("/usr/lib/gcc/x86_64-linux-gnu/4.6/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/4.6/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../x86_64-linux-gnu/lib/specs", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/lib/gcc/x86_64-linux-gnu/specs", R_OK) = -1 ENOENT (No such file or directory)

然后通过转储内置规范文件在上述位置之一创建模板文件:

$ sudo bash -c 'gcc -dumpspecs > /path/to/specs'

此时,gcc -v的输出应该从此

更改
$ gcc -v
Using built-in specs.
(...snip...)

类似

$ gcc -v
Reading specs from /usr/lib/gcc/x86_64-linux-gnu/4.6/specs
(...snip...)

现在您需要根据需要修改specs文件。语法确实很神秘,但你可以用你的想象力。提示:你应该看到像

这样的东西
*cpp_options:
%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w} %{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*} %{undef} %{save-temps*:-fpch-preprocess} %(ssp_default)

看看这部分:

%{std*&ansi&trigraphs}

这是在-std=c99命令构造预处理器gcc的完整命令行之前展开cpp的地方。您应该能够在它之前插入-std=c99,以便它可以作为-std选项的默认值。为*cc1_options做同样的事情,这对你的目的来说实际上更重要。

答案 1 :(得分:4)

我不知道答案,但你应该只使用一个makefile。

非常简单的makefile:

CC = gcc
CFLAGS = -g -Wall -std=c99
OBJECTS = *.c  #Source files
NAME = FILENAME  #Desired filename
TODELETE = $(NAME) *.o # the *.o should be the same as the objects
LIBS = NECESSARY_LIBS #remove line if no external libraries needed

mt-collatz : $(OBJECTS)
<INSERT TAB>$(CC) $(CFLAGS) $(OBJECTS) -o $(NAME) $(LIBS)

.PHONY: clean
clean:
<INSERT TAB>rm -f $(TODELETE)

键入make进行编译,make clean以删除编译对象。使用#符号删除评论,并添加一个标签,其中显示INSERT TAB,因为我不知道如何在SO上执行此操作。

你实际上不必删除OBJECTS和TODELETE中的* .c和* .o,但是如果你最终有一个带有main函数的文件,它会抱怨。

答案 2 :(得分:1)

好方法是使用Makefile之类的$PATH。另请参阅answered by Christopher Schneider

您还可以拥有一个shell脚本(位于/usr/bin之前的gcc中),甚至可以命名为$HOME/bin/gcc(即$HOME/bin/usr/bin/放置<在您的$PATH ~/.bashrc之前的em>,请参阅/usr/bin/gcc),该alias会使用所需选项调用gcc。对于交互式使用,您还可以cc1 {{1}}命令。

最后,this example正在使用GCC。您可以更改系统的spec文件以添加特定选项(对于{{1}})。我不确定这是个好主意。

GCC的下一版本(5.0)将默认为spec-files

答案 3 :(得分:1)

您可以将此添加到您平台上的~/.profile或类似内容中:

CFLAGS="$CFLAGS -std=c99"

然后Make和类似的工具应该每次都拿起它。

至于为什么它不是默认值:向后兼容性!