首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >可以将GCC中的std=c99设定为默认吗?

可以将GCC中的std=c99设定为默认吗?
EN

Stack Overflow用户
提问于 2014-10-28 02:00:54
回答 4查看 6.8K关注 0票数 3

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

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

代码语言:javascript
代码运行次数:0
运行
复制
for(int i = 0; i < 10; i++) {...

没有c99标志,这是不可能的,我将不得不在外部声明自己的行,我认为这是愚蠢的。为什么GCC不默认使用C99编译呢?(正当地好奇,而不是抱怨。请不要责骂)

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-28 03:33:35

我不知道答案,但您应该使用makefile。

非常简单的makefile:

代码语言:javascript
代码运行次数:0
运行
复制
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,但如果最终有多个带有主函数的文件,它会发出抱怨。

票数 5
EN

Stack Overflow用户

发布于 2014-10-28 04:02:56

如果确实希望每次添加-std=c99,则可以修改所谓的"spec文件“,这是gcc命令的配置文件。注意,gcc命令实际上是一个编译器驱动程序,它只在狭义上调用编译器(在GCC工具链的情况下,后者是cclcc1plus )。

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

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

代码语言:javascript
代码运行次数:0
运行
复制
$ 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)

然后通过转储内置的规范文件,在上面的一个位置创建一个模板文件:

代码语言:javascript
代码运行次数:0
运行
复制
$ sudo bash -c 'gcc -dumpspecs > /path/to/specs'

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

代码语言:javascript
代码运行次数:0
运行
复制
$ gcc -v
Using built-in specs.
(...snip...)

到某种程度上

代码语言:javascript
代码运行次数:0
运行
复制
$ gcc -v
Reading specs from /usr/lib/gcc/x86_64-linux-gnu/4.6/specs
(...snip...)

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

代码语言:javascript
代码运行次数:0
运行
复制
*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)

看看这部分:

代码语言:javascript
代码运行次数:0
运行
复制
%{std*&ansi&trigraphs}

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

票数 10
EN

Stack Overflow用户

发布于 2014-10-28 03:38:49

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

代码语言:javascript
代码运行次数:0
运行
复制
CFLAGS="$CFLAGS -std=c99"

然后,制造和类似的工具应该捡起它每次。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26599758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档