使用#pragma warning push/pop 是暂时改变警告级别的正确方法吗?

2023-11-30

有时很难编写完全不发出警告的 C++ 代码。然而,启用警告是一个好主意。因此,通常有必要禁用某些特定构造的警告,并在所有其他代码片段中启用它们。

到目前为止我已经看到了两种方法。

第一个是使用#pragma warning( push ) and #pragma warning( pop ):

 #pragma warning( push )
 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

第二种是使用#pragma warning( default ):

 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( default: ThatWarning )

我在第二个变体中看到的问题是它丢弃了原始的警告级别 - 警告可能在此之前已关闭或其警告级别可能已更改。使用default将放弃这些更改。

第一种方法看起来很干净。它有什么问题吗?有没有更好的方法来实现同样的目标?


这将适用于多个编译器(以及不同版本的编译器)。

标题“推”

#if defined(__clang__)
# pragma clang diagnostic push
#endif

#if defined(_MSC_VER)
# pragma warning(push)
#endif

#if defined(YOUR_FAVORITE_COMPILER)
# pragma your compiler push warning
#endif

标题“流行”

#if defined(__clang__)
# pragma clang diagnostic pop
#endif

#if defined(_MSC_VER)
# pragma warning(pop)
#endif

一些警告

#if defined(__clang__)
# pragma clang diagnostic ignored "-Wunused-parameter"
# pragma clang diagnostic ignored "-Wunused-variable"
#  if __has_warning("-Wnew-special-warning")
#   pragma clang diagnostic ignored "-Wnew-special-warning"
#  endif
#endif

#if defined(_MSC_VER)
# pragma warning(disable: 4100) // unreferenced formal parameter
# if _MSC_VER > _MSC_SOME_VERSION
#  pragma warning(disable: xxxx) // disable one more for special version
# endif
#endif

Usage

// This code reports warnings
// ...
#include <ignore_compiler_warning/push>
#include <ignore_compiler_warning/warning_type_1>
#include <ignore_compiler_warning/warning_type_2>
#include <ignore_compiler_warning/warning_type_3>
// This code ignores warnings type_{1,2,3}
// ...
#include <ignore_compiler_warning/pop>
// Back to reporting warnings
// ...

Additionally include guards can check that there is no double push/pop/disable-warning pragmas.

Update

  • 执行
  • 可用警告列表
  • 用于生成标志的 CMake 配套函数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用#pragma warning push/pop 是暂时改变警告级别的正确方法吗? 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • 排除错误消息中前置的属性名称

    我有一个简单的国际化 attributes user login Login errors template header Errors body models user attributes login taken The chosen
  • Gtk:如何检测EventBox上的鼠标位置?

    I have been trying to write simple CAD application in Python I was tinkering with pyglet got some results but I decided
  • 如何在 R corrgram 中添加轴标签?

    我想在 x 轴和 y 轴上有水平和垂直标签 请参阅以下伪代码 Henrik 对相关线程 2013 的评论是关于关闭对角线标签 然后尝试关联轴的标签 但我不想关闭对角线标签 您可以通过设置 labels NULL 来关闭对角线标签 然后您可以
  • 使用服务主体创建 Azure AD 应用程序时权限不足,无法完成操作

    按照此处概述的代码进行操作 https github com Azure Samples active directory dotnet graphapi console blob master GraphConsoleAppV3 Prog
  • 将纬度和经度点转换为 UTM

    我找到了一个相当简单的示例来说明如何执行此操作 但我无法让它为我工作 我对 R 还很陌生 library rgdal xy lt cbind c 118 119 c 10 50 project xy proj utm zone 51 ell
  • SmtpClient 类未从 Web.Config 文件中获取默认参数

    配置文件
  • 在 Ember.js #each 中生成循环计数器

    我发现 Ember js 中车把模板的限制绝对是严重的 你不能执行任意的 JavaScript 您获得的只是一组固定的能力 if else each action view outlet 以及输出当前上下文对象的属性值的能力 这意味着我无法
  • Java 线程优先级

    我的主线程有一个私有 LinkedList 其中包含游戏中玩家的任务对象 然后 我有一个单独的线程 每小时运行一次 用于访问和清除该 LinkedList 并运行我的算法 该算法随机向每个玩家 LinkedList 添加新的未完成任务 现在
  • 在Scrapy中禁用SSL证书验证

    我目前正在努力解决 Scrapy 遇到的问题 每当我使用 Scrapy 抓取证书 CN 值与服务器域名相匹配的 HTTPS 站点时 Scrapy 都表现出色 但另一方面 每当我尝试抓取证书 CN 值与服务器域名不匹配的网站时 我都会得到以下
  • 当子类中使用“new”时,JavascriptSerializer 序列化属性两次

    尝试创建一项服务来返回具有许多共享属性的对象 但在某些情况下一个属性应该受到高度限制 这会导致奇怪且不期望的行为 即在序列化输出中重复使用属性名称 从而导致浏览器中出现不正确的行为 这是一个可以粘贴到 LINQPad 中的示例 如果您添加对
  • 使用刷新令牌 adal js 获取新的访问令牌

    我正在使用在天蓝色广告中进行身份验证的应用程序 我使用 adal js 获取访问令牌 但访问令牌的有效期仅为 1 小时 那么如何使用 Adal js 中的刷新令牌在幕后获取新令牌呢 如果您能提供示例代码 我们将不胜感激 只要用户与 Azur
  • JMeter无法使用插件打开JMeter文件

    当我尝试打开保存的 jmx 时出现错误 我的备份已经一周了 我尝试遵循类似的问题 但也无法使用 JMeter 3 1 加载它 我安装了新的 JMeter 3 2 并安装了所有可用插件的插件 但仍然收到错误 2017 08 30 10 03
  • 使用 NSNotificationCenter 向另一个类发送通知

    所以我的目标是使用以下命令向另一个班级发送通知NSNotificationCenter 我也想通过object并通知对方class 我该怎么做 您必须先注册一个通知名称 NSNotificationCenter defaultCenter
  • C 语言翻译的 8 个阶段的海报

    有没有人参考过海报 单页 pdf 或类似的内容 其中包含 C 语言翻译的八个阶段的列表 第一个阶段是三字母翻译 我想打印一张挂在电脑旁边的墙上 更新 抱歉忘记指定 我对 C90 感兴趣 虽然 C99 可能非常接近 Pragma正如 PMG
  • R:如何在 ggplotly 中自定义桑基图?

    我有按年份和型号划分的销售数据 可以通过以下方式可视化桑基图 现在我正在努力处理两个问题 首先我需要设置模型B多年来 无论其价值如何 总是处于闲聊的底部 当我通过重新可视化 ggplot 时ggplotly hover不显示销售额或年份 c
  • Jenkins 管道 ansicolor 控制台输出

    我知道可以使用 AnsiColor 插件在控制台输出中显示颜色 我测试了下面的基本示例 This shows a simple build wrapper example using the AnsiColor plugin node Th
  • Python 迭代器没有ext() 吗?

    Python 迭代器有吗hasnext method 捕捉的替代方案StopIteration是使用next iterator default value 例如 gt gt gt a iter hi gt gt gt print next
  • Android:如何写入SQL数据库

    我一直在尝试遵循 newBoston 教程 但当我单击按钮将数据写入数据库时 发现出现运行时错误 LogCat 显示 在活动中找不到方法 addModuleButton View 有什么建议么 添加模块活动 public class Add
  • 从另一个线程填充列表视图

    我试图从另一个类填充列表视图 但出现此错误 跨线程操作无效 控制 listView1 是从创建它的线程以外的线程访问的 在我的课堂上 我像这样声明我的列表视图 class CheckBlankPages public String pdfF
  • 使用#pragma warning push/pop 是暂时改变警告级别的正确方法吗?

    有时很难编写完全不发出警告的 C 代码 然而 启用警告是一个好主意 因此 通常有必要禁用某些特定构造的警告 并在所有其他代码片段中启用它们 到目前为止我已经看到了两种方法 第一个是使用 pragma warning push and pra