首先,是否可以编辑GCC命令行设置,使我不必每次都使用-std=c99标志进行编译?
其次,为什么c99不是默认的行为呢?使用c99编译允许某些现代编程约定,例如在for循环中创建和初始化索引变量。
for(int i = 0; i < 10; i++) {...
没有c99标志,这是不可能的,我将不得不在外部声明自己的行,我认为这是愚蠢的。为什么GCC不默认使用C99编译呢?(正当地好奇,而不是抱怨。请不要责骂)
谢谢。
发布于 2014-10-28 03:33:35
我不知道答案,但您应该使用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来编译,让干净移除已编译的对象。删除带有#符号的注释,并添加一个选项卡,其中写着插入tab,因为我不知道如何这样做。
实际上,您不必删除对象和TODELETE中的*.c和*.o,但如果最终有多个带有主函数的文件,它会发出抱怨。
发布于 2014-10-28 04:02:56
如果确实希望每次添加-std=c99
,则可以修改所谓的"spec文件“,这是gcc
命令的配置文件。注意,gcc
命令实际上是一个编译器驱动程序,它只在狭义上调用编译器(在GCC工具链的情况下,后者是ccl
或cc1plus
)。
修改规范文件现在有点棘手,因为默认情况下,它只存在于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...)
现在,您需要根据需要修改规范文件。语法确实很神秘,但你可以利用你的想象力。提示:你应该看到
*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
命令为预处理器cpp
构造完整命令行之前,扩展到cpp
的地方。您应该能够在-std=c99
之前插入它,以便它作为您自己的-std
选项的默认值工作。对*cc1_options
也做同样的事情,这对你的目的来说更重要。
发布于 2014-10-28 03:38:49
您可以在您的平台上将其添加到~/.profile
或类似的内容中:
CFLAGS="$CFLAGS -std=c99"
然后,制造和类似的工具应该捡起它每次。
至于为什么它不是默认的:向后兼容性!
https://stackoverflow.com/questions/26599758
复制相似问题