在gcc中,“-Wextra”和“-pedantic”有什么区别?

kx5bkwkv  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(661)

或者--谁“更严格”?
what I've read开始,这两个标志都添加了额外的警告,这些警告不包括在'-Wall'中,但是它们有什么区别呢?

t5zmwmid

t5zmwmid1#

-Wextra是关于打开警告的,这些警告可能比其他选项更有用或更麻烦(因为它们可能警告程序员可以接受的代码)。它通常用于当你想仔细检查代码是否有问题,并进行修改以满足这些额外的警告时。
-Wpedantic是关于更严格地遵守语言标准的。它警告编译器认为正常的语言扩展的某些使用,但这可能使程序不可移植到其他编译器。

kmbjn2e3

kmbjn2e32#

-Wpedantic会胁迫执行ISO C和ISO C++标准。
就我个人而言,我发现这是没有帮助和麻烦的,所以我更喜欢-Wall -Wextra -Werror而不是-Wall -Wextra -Wpedantic -Werror,因为我经常依赖于gcc或clang中的编译器扩展,特别是当在嵌入式系统(如微控制器)上编程时,或者当使用寄存器、二进制包等进行低级工作时。
以下是我在eRCaGuy_hello_world的自述文件中的一些注解:

  • 使用-Wall -Wextra -Werror(这是一个好主意)来查看所有警告并将所有警告转换为错误,以使您编写更好的代码。有些人可能会省略-Wextra,而只使用-Wall -Werror。其他人可能也会将-Wpedantic添加到该列表中(现在是-Wall -Wextra -Wpedantic -Werror)来强制执行ISO C和ISO C++标准,但其他人或代码库将显式关闭pedantic,并将-Wno-pedantic显式设置为DISABLE pedantic(ISO标准)检查并允许编译器扩展。就个人而言,我更喜欢让编译器扩展处于启用状态(意思是:请勿使用-Wpedantic),因为编译器扩展非常常用且非常有用,尤其是在小型、嵌入式、低级和以硬件为中心的系统(如微控制器)中。
  • 换句话说,我建议你使用-Wall -Wextra -Werror,但不要使用-Wpedantic,但如果你也想使用-Wpedantic,你可以。请参阅下面的详细信息。
  • 关于-Wall-Wextra警告标志的详细信息,请参考gcc用户手册(https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html),并搜索这些警告标志的页面,或者只向下滚动一半。有一个很好的列表详细说明了每个警告标志下的警告标志(-Wall-Wextra)。
  • 添加-Wpedantic-pedantic(同样的事情)build flag来强制执行严格的ISO C或ISO C++标准,并“拒绝所有使用禁用扩展的程序”。或者,相反地,添加-Wno-pedantic到ENABLE扩展,并将先前设置的-Wpedantic重新设置为OFF。-Wpedantic NOT是默认设置。请参阅gcc用户手册中的警告选项部分,例如,以及上面的项目符号,以了解详细信息:是的。
  • 有些人只想要严格的ISO C和C++功能。他们使用-Wpedantic
  • 某些库需要编译器扩展,并显式地为库设置-Wno-pedantic以 * 启用 * 编译器扩展并 * 禁用 * 任何先前设置的-Wpedantic标志。有时这只是针对某些文件,这些文件需要例外以使用某些编译器扩展。
  • 其他人依赖于编译器扩展,不使用-Wpedantic。我属于后一类,不喜欢使用-Wpedantic,所以我可以使用gcc(或clang)编译器扩展。它们是好的。它们是安全的。它们是有帮助的。它们只是可能不太像跨编译器的可移植性是所有的,虽然从gcc到clang再回来,你通常可以使用它们,由于Clang通过设计努力成为GCC兼容的(参见X1 E2 F1 X:Clang努力与gcc兼容:他们宣传的“最终用户功能”包括:“GCC兼容性”)。
  • 另请参阅我在上一个更高级别的项目符号中关于-Wpedantic的注解。
  • clang,而不是gcc,也有一个-Weverything选项,* 看起来 * 包含了-Wpedantic之类的内容。https://godbolt.org/z/qcYKd1。请注意,我们会收到-Wvla-extension警告,因为在本例中,我们依赖于C++中的C99扩展,并且设置了-Weverything。如果只使用-Wpedantic,我们会收到相同的警告,如下所示:https://godbolt.org/z/M9ahE4,表示-Weverything实际上包含-Wpedantic。如果没有设置这两个标志,则不会得到 * 警告 *:https://godbolt.org/z/j8sfsY。尽管-Weverything已经存在并且在clang中工作,但是我找不到任何关于它存在的文档,无论是在clang手册页中还是在下面的在线手册中:https://clang.llvm.org/docs/DiagnosticsReference.html
  • 请注意,-Wc99-extensions也有一个clang(至少)选项来允许它们,或者-Wno-c99-extensions不允许它们。https://clang.llvm.org/docs/DiagnosticsReference.html#wc99-extensions。
  • UPDATE:主clang文档索引页的底部:https://clang.llvm.org/docs/index.html在最底部的“Indices and tables”部分下有一个“Search Page”链接。使用该链接,下面是我对“-Weverything”的搜索:https://clang.llvm.org/docs/search.html?q=-Weverything,这就把我带到了这里的官方文档!:https://clang.llvm.org/docs/UsersManual.html?highlight=weverything#cmdoption-weverything。完成了!就在那里!
    ***在这里看到我的答案:**clang编译器的'-Weverything'选项包括什么,它在哪里被文档化了?. Clang不推荐使用-Weverything!他们说只使用-Wall -Wextra更好。在这里看到他们的引用(着重号是添加的):

由于-Weverything启用每个诊断,我们通常**不建议使用它。****-Wall -Wextra对于大多数项目来说是更好的选择。**使用-Weverything意味着更新编译器更加困难,因为您将面临实验性诊断,这些诊断的质量可能低于默认诊断。如果您确实使用了-Weverything,那么我们建议您在将所有新的编译器诊断添加到Clang时,通过修复它们找到的所有内容或使用相应的Wno-选项显式禁用该诊断来解决它们。

相关问题