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

标签 c gcc c99

这个问题在这里已经有了答案:





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 实际上是一个编译器驱动程序,它只在狭义上调用编译器(后者是 cclcc1plus 在 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/

相关文章:

c - 十六进制字符串作为 gdb 中 scanf 的输入

android - 如何将变量参数传递给 __android_log_print?

计算 C 源代码中忽略注释和空行的行数

c - gcc 内联汇编错误 "operand type mismatch for mov"

c - 如何使用rand——C99版本

c - 在嵌入式 C 中使用 RTOS 处理多任务文件系统的最佳方法?

linux - Linux 上 Solaris Studio 中的原子操作

c - 在 Mac 上使用 'brew install avr-libc' 命令产生错误 'no formulae found in taps'

我可以在 C99 中使用数组作为函数参数吗?

gcc - GCC位域实现中的错误