或者--谁“更严格”?从what I've read开始,这两个标志都添加了额外的警告,这些警告不包括在'-Wall'中,但是它们有什么区别呢?
t5zmwmid1#
-Wextra是关于打开警告的,这些警告可能比其他选项更有用或更麻烦(因为它们可能警告程序员可以接受的代码)。它通常用于当你想仔细检查代码是否有问题,并进行修改以满足这些额外的警告时。-Wpedantic是关于更严格地遵守语言标准的。它警告编译器认为正常的语言扩展的某些使用,但这可能使程序不可移植到其他编译器。
-Wextra
-Wpedantic
kmbjn2e32#
-Wpedantic会胁迫执行ISO C和ISO C++标准。就我个人而言,我发现这是没有帮助和麻烦的,所以我更喜欢-Wall -Wextra -Werror而不是-Wall -Wextra -Wpedantic -Werror,因为我经常依赖于gcc或clang中的编译器扩展,特别是当在嵌入式系统(如微控制器)上编程时,或者当使用寄存器、二进制包等进行低级工作时。以下是我在eRCaGuy_hello_world的自述文件中的一些注解:
-Wall -Wextra -Werror
-Wall -Wextra -Wpedantic -Werror
-Wall -Werror
-Wno-pedantic
-Wall
-pedantic
-Weverything
-Wvla-extension
-Wc99-extensions
-Wno-c99-extensions
-Wall -Wextra
由于-Weverything启用每个诊断,我们通常**不建议使用它。****-Wall -Wextra对于大多数项目来说是更好的选择。**使用-Weverything意味着更新编译器更加困难,因为您将面临实验性诊断,这些诊断的质量可能低于默认诊断。如果您确实使用了-Weverything,那么我们建议您在将所有新的编译器诊断添加到Clang时,通过修复它们找到的所有内容或使用相应的Wno-选项显式禁用该诊断来解决它们。
Wno-
2条答案
按热度按时间t5zmwmid1#
-Wextra
是关于打开警告的,这些警告可能比其他选项更有用或更麻烦(因为它们可能警告程序员可以接受的代码)。它通常用于当你想仔细检查代码是否有问题,并进行修改以满足这些额外的警告时。-Wpedantic
是关于更严格地遵守语言标准的。它警告编译器认为正常的语言扩展的某些使用,但这可能使程序不可移植到其他编译器。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用户手册中的警告选项部分,例如,以及上面的项目符号,以了解详细信息:是的。-Wpedantic
。-Wno-pedantic
以 * 启用 * 编译器扩展并 * 禁用 * 任何先前设置的-Wpedantic
标志。有时这只是针对某些文件,这些文件需要例外以使用某些编译器扩展。-Wpedantic
。我属于后一类,不喜欢使用-Wpedantic
,所以我可以使用gcc(或clang)编译器扩展。它们是好的。它们是安全的。它们是有帮助的。它们只是可能不太像跨编译器的可移植性是所有的,虽然从gcc到clang再回来,你通常可以使用它们,由于Clang通过设计努力成为GCC兼容的(参见X1 E2 F1 X:Clang努力与gcc兼容:他们宣传的“最终用户功能”包括:“GCC兼容性”)。-Wpedantic
的注解。-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。***在这里看到我的答案:**clang编译器的'-Weverything'选项包括什么,它在哪里被文档化了?. Clang不推荐使用
-Weverything
!他们说只使用-Wall -Wextra
更好。在这里看到他们的引用(着重号是添加的):由于
-Weverything
启用每个诊断,我们通常**不建议使用它。****-Wall -Wextra
对于大多数项目来说是更好的选择。**使用-Weverything
意味着更新编译器更加困难,因为您将面临实验性诊断,这些诊断的质量可能低于默认诊断。如果您确实使用了-Weverything
,那么我们建议您在将所有新的编译器诊断添加到Clang时,通过修复它们找到的所有内容或使用相应的Wno-
选项显式禁用该诊断来解决它们。