首先,是否可以编辑GCC命令行设置,这样我就不必每次都使用-std = c99标志进行编译?
其次,为什么c99不是默认行为?使用c99进行编译允许某些现代编程约定,例如在for循环中创建和初始化索引变量。
for(int i = 0; i < 10; i++) {...
没有c99标志,这是不可能的,我必须在自己的行上声明我认为是愚蠢的。为什么GCC默认不会使用C99编译? (正常好奇,不抱怨。请不要抨击)
感谢。
答案 0 :(得分:8)
如果您真的希望每次都添加-std=c99
,您可以修改所谓的&#34; spec文件&#34;这是gcc
命令的配置文件。请注意,gcc
命令实际上是一个编译器驱动程序,它只在较窄的意义上调用编译器(在GCC工具链的情况下,后者为ccl
或cc1plus
。)
现在修改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和类似的工具应该每次都拿起它。
至于为什么它不是默认值:向后兼容性!