在 GCC/G 编译器中使用 -pedantic 的目的是什么?

新手上路,请多包涵

这篇笔记 说:

-ansi :告诉编译器实现ANSI语言选项。这会关闭与 ANSI 标准不兼容的 GCC 的某些“功能”。

-pedantic :与 -ansi 一起使用,这告诉编译器严格遵守 ANSI 标准,拒绝任何不符合的代码。

第一件事:

  • GCC/G++ 编译器的 -pedantic-ansi 选项的目的是什么(我看不懂上面的描述)?
  • 使用这两个选项的正确情况是什么?
  • 我应该什么时候使用它们?
  • 它们重要吗?

原文由 huahsin68 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

如果可能的话,GCC 编译器总是试图编译你的程序。但是,在某些情况下,C 和 C++ 标准指定禁止某些扩展。遇到这些扩展时,符合标准的编译器(例如 GCC 或 g++)必须发出诊断。

例如,GCC 编译器的 -pedantic 选项会导致 GCC 在这种情况下发出警告。使用更严格的 -pedantic-errors 选项会将此类诊断警告转换为将导致编译在此类点失败的错误。只有那些需要由符合标准的编译器标记的非 ISO 结构才会生成警告或错误。

原文由 Wazery 发布,翻译遵循 CC BY-SA 4.0 许可协议

< -ansi 是一个过时的开关,它要求编译器根据已有 30 年历史 的 C 标准的过时修订版 ISO/IEC 9899:1990 进行编译,这本质上是对 ANSI 标准 X3 的更名。 159-1989 “Programming Language C . 为什么会过时?因为 C90 由 ISO 发布后,ISO 一直负责 C 的标准化,对 C90 的任何 技术勘误 都由 ISO 标准化。因此更倾向于使用 -std=c90

如果没有此开关,最新的 GCC C 编译器将符合 ISO/IEC 9899:2011 或最新的 2018 修订版中标准化的 C 语言。

不幸的是,有一些懒惰的编译器供应商认为坚持使用较旧的过时标准修订版是可以接受的,标准机构甚至没有标准化文档。

使用该开关有助于确保代码应该在这些过时的编译器中编译。


-pedantic 很有趣。在没有 -pedantic 的情况下,即使请求了特定的标准,GCC 仍将允许一些 C 标准中不可接受的扩展。例如考虑程序

struct test {
    int zero_size_array[0];
};

C11 草案 n1570 第 6.7.6.2p1 段说

除了可选的类型限定符和关键字 static,[ 和 ] 可以分隔表达式或 *。如果它们分隔了一个表达式(它指定了一个数组的大小),则该表达式应为整数类型。如果表达式是常量表达式, 它的值应大于零。 […]

C标准要求数组长度大于零;而这一段是在 约束 中;该标准说以下 5.1.1.3p1

如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的行为,则符合的实现应产生至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现-定义。在其他情况下不需要生成诊断消息。9)

但是,如果您使用 gcc -c -std=c90 pedantic_test.c 编译程序,则不会产生警告。

-pedantic 使编译器实际上 符合 C 标准;所以现在它将产生一条诊断消息,正如标准所要求的:

 gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
     int zero_size_array[0];
         ^~~~~~~~~~~~~~~

因此,为了获得最大的可移植性,仅指定标准版本是不够的,您还必须使用 -pedantic (或 -pedantic-errors )来确保 GCC 确实符合标准的规定。


问题的最后一部分是关于使用 -ansiC++ 。 ANSI 从未对 C++ 语言进行标准化 - 仅从 ISO 中采用它,因此这与说“法国标准化的英语”一样有意义。然而 GCC 似乎仍然接受它用于 C++,这听起来很愚蠢。

原文由 Antti Haapala – Слава Україні 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题