这个问题在这里已经有了答案:
Setting std=c99 flag in GCC
(2 个回答)
7年前关闭。
首先,是否可以编辑 GCC 命令行设置,以便我不必每次都使用 -std=c99 标志进行编译?
其次,为什么 c99 不是默认行为?使用 c99 进行编译允许某些现代编程约定,例如在 for 循环中创建和初始化索引变量。
for(int i = 0; i < 10; i++) {...
如果没有 c99 标志,这是不可能的,我必须在自己的行上在外部声明,我认为这很愚蠢。为什么 GCC 默认不直接用 C99 编译? (合法地好奇,而不是提示。拜托,不要抨击)
谢谢。
最佳答案
如果您 真想加-std=c99
每次,您都可以修改所谓的“规范文件”,它是gcc
的配置文件。命令。请注意 gcc
command 实际上是一个编译器驱动程序,它只在狭义上调用编译器(后者是 ccl
或 cc1plus
在 GCC 工具链的情况下)。
现在修改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...)
现在您需要根据需要修改规范文件。语法确实很神秘,但你可以发挥你的想象力。提示:你应该看到类似
*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
之前command 为预处理器构建完整的命令行 cpp
.您应该可以插入 -std=c99
就在它之前,以便它作为您自己的默认值 -std
选项。对 *cc1_options
执行相同操作这实际上对您的目的更重要。
关于可以在 GCC 中将 std=c99 设置为默认值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26599758/