c - 在 gcc 中编译时关于警告输出的最佳实践?

标签 c gcc compilation

<分区>

我正在学习 c 并在 linux 子系统 for windows 中使用 gcc 编译我所有的程序。

我了解到我可以根据 gcc 标准包含一些标志。一些包括基本的 -o 或 -lm。 我发现了 -Wall 标志,它在我修复的 shell 中输出了一些警告。

现在我常用的 gcc 编译行通常位于 cc -Wall -lm -o file.exe file.c 行。

我最近了解到还有很多其他的标志可以包括在内,一些是关于警告的;一个是 -w,它应该显示比 -Wall 更多的警告,所以我的问题是 -

1- 我应该始终指定 -w 吗?还是有任何缺点,甚至可能发出不正确的警告?

2- 另外,编译程序时的最佳实践是什么,即您总是打开哪些选项/标志?

最佳答案

  1. 您变得越专业,您努力启用的警告就越多。我目前最喜欢的集合是 -Wall -Wextra -pedantic,它给出了很好的平均水平。

    如果您认为自己收到了虚假警告,请三思。编译器几乎总是正确的。在您成为 C 标准的亲密专家之前,您最好问一下,例如在 SO 上。

    有些人认为 -Werror 有一定的值(value),对于他们的开发过程来说,他们可能是对的。由于我使用某种构建控制软件(即“make”),所以我不需要它,因为 GCC 也会在警告时返回非零值。

  2. 所有其他标志取决于命令的目的。一些例子:

    • -o 非常适合定义输出文件的名称。
    • (EDIT)-O ... 设置优化级别;几年前 -O3 可能有一些问题,但今天应该没问题。
    • -s 从输出中去除调试信息;适合发布版本。
    • -g 在输出中包含调试信息;根据您的目标,有多种变体。
    • -Wl,--wrap ... 对于特殊调试和/或测试来说非常复杂;阅读其文档。

关于c - 在 gcc 中编译时关于警告输出的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58903839/

相关文章:

c++ - 确保程序在 C++/fortran 中的适当位置因运行时错误而崩溃

编译器错误消息定制

python - 从 python 代码编译 DLL

javascript - AngularJS - 范围在链接函数中重置,我做错了什么?

c - getint(int *) 是什么意思?

c - 链表头始终为空

c - C中字符串数组的重新分配和新字符串的分配

c - 直接访问函数栈

gcc - 为什么 GCC (ARM Cortex-M0) 在应该知道数据已经是 uint8 的情况下生成 UXTB 指令

macros - 当协议(protocol)调用表单包含 &lt;!宏(多方法 '-item-to-ssa' 无法在 :protocol-invoke) 上调度