在使用gcc编译的文件(几个. c和. cpp文件)中,我目前有如下内容:

#if defined(__GNUC__) && !defined(__clang__)
    #pragma GCC diagnostic warning "-Wall"
#endif

指定内联选项而不是仅仅使用命令行的目的是控制在哪些点之后我会更严格地进行操作(例如,#include人名单之后).

很好用.然后,我try 添加-Wextra:

#if defined(__GNUC__) && !defined(__clang__)
    #pragma GCC diagnostic warning "-Wall -Wextra"
#endif

失败了.显然,你不能在一个pragma中使用多个选项,你必须使用几行来代替:

#if defined(__GNUC__) && !defined(__clang__)
    #pragma GCC diagnostic warning "-Wall"
    #pragma GCC diagnostic warning "-Wextra"
#endif
  • Q1:是否有一种方法可以在线指定多个选项?

接下来,我try 添加-Werror-pedantic,但使用diagnostic warningdiagnostic error都不起作用.示例:

    #pragma GCC diagnostic error "-Werror"

失败:warning: ‘-Werror’ is not an option that controls warnings.我该怎么解决这个问题?除了diagnostic [warning|error]还有哪些 Select -pedantic还是-pedantic-errors呢?因为我知道迂腐主要与标准遵从性有关,而不是诊断控制,我甚至不知道我是否可以内联指定它.

推荐答案

你不能就是这样

您可以打开或关闭特定的警告,或者将它们变成错误,但您不能像您所注意到的那样,使用#pragma来完成所有事情."-Wpedantic"可以控制.

一般来说,我仍然把大多数选项放在构建文件中,包括-Werror个选项.我不认为持续切换代码段的警告是个好主意.

在某些header给出警告的情况下(罕见),我使用pragmas来禁用该header的警告—push个设置,禁用警告,包括header,pop个设置.这导致了像这样的 struct

#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#pragma GCC diagnostic ignored "-Wsign-conversion"
#pragma GCC diagnostic ignored "-Wshadow"
#endif

#include "External/ProtoPuf/message.h"

#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif

但是,我不会在自己的代码中使用这样的东西——相反,我会修复代码中的警告,或者如果它太烦人,就从构建系统中删除警告.

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

为什么PLT表中没有push指令?

通过MQTT/蚊子发送大文件—限制在4MB

在32位处理器上优化53—32位模计算>

来自stdarg.h的c中的va_args无法正常工作<>

堆栈在作用域阻塞后会被释放吗?

模拟shell并运行.sh文件

为什么STM32G474RE上没有启用RCC PLL

正确的TCP/IP数据包 struct

以下声明和定义之间的区别

为什么cudaFree不需要数据 struct 的地址?

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

在C语言中,是否可以使枚举数向后计数?

用gcc-msse 2编译的C程序包含AVX 1指令

C:在编译时构建和使用字符串文字的预处理器宏?

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

如何读取程序中嵌入的数据S自己的ELF?

为什么我的旧式&q;函数在传递浮点数时会打印2?

在链表中插入一个值