禁止 GCC 下的不兼容指针类型特定警告

2024-03-18

在 GCC 下的代码中,我收到了很多这两种类型的警告。

warning: passing argument 1 of 'foo' from incompatible pointer type

and

warning: assignment from incompatible pointer type

我知道通常情况下,这两个警告是严重的警告,表明代码中确实存在错误。就我而言,无论这些情况发生在哪里,我都非常清楚自己在做什么,并且我知道我可以安全地忽略这些警告。 (是的,我确信这一点)

但现在我的代码已经增长到这样的程度,这些警告掩盖了其他任何内容,实际上隐藏了可能导致我遇到严重错误的潜在警告。所以我决定抑制他们。很快我就意识到我不知道该怎么办。我的 gcc 版本是 4.4.1,我知道我可以使用:

#pragma GCC diagnostic ignore "-Wname" 

忽略我想要的任何警告。但从唯一又大又全面的清单 http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html在我发现的 GCC 警告中,我似乎找不到这两个是哪一个。我把它们一一挑选出来,并将它们变成错误,看看编译何时会因指针类型不兼容而停止,但没有效果,如下所示。

#pragma GCC diagnostic error "-Wimplicit-int"   
#pragma GCC diagnostic error "-Waddress"
#pragma GCC diagnostic error "-Wreturn-type"
           .... //e.t.c.

所以..问题是,有人知道这些警告的名称,以便我可以真正抑制它们吗?

EDIT

由于评论中的讨论,我必须澄清我的一个误解,它使我相信我必须抑制警告。我认为在指向结构的指针之间执行显式转换会涉及一些成本(无论多么微小)。

所以我的想法(现在我意识到是有缺陷的)是,既然我的程序可以工作并且已经在不同平台下工作了很长时间,为什么要添加工作来满足编译器的需求呢?

好吧,我现在意识到了,我把它写在这里,以防其他人偶然发现这个话题并有同样的想法。执行指针的显式类型转换不涉及任何成本,优点是:

  • 编译器不再用警告来烦你
  • 其他人可以知道你在那里是故意选角的并且没有犯错误

所以这里是为其他可能有同样问题的人提供的。


如果您使用-fdiagnostics-show-option选项,GCC 将显示警告的名称,然后您可以禁用它。

不过,禁用警告可能不是一个好主意:如果以后出现此警告的合法情况,您将不会知道它。

您最好修复代码以防止出现警告。在您的情况下,这就像添加显式指针转换一样简单。

float f = 1.23;
char *a = &f; //warning
char *b = (char*)&f; //no warning

使用显式转换将使任何阅读代码的人都清楚更改指针类型是故意完成的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

禁止 GCC 下的不兼容指针类型特定警告 的相关文章

随机推荐

  • Django 可重用应用程序教程,ImportError:没有名为“polls”的模块

    我试图跟随 本教程 https docs djangoproject com en 1 8 intro reusable apps 重用民意调查应用程序 但是当我成功打包应用程序并安装包后 Unpacking home julia Docu
  • 循环遍历目录中的文件,在 pandas 中添加日期列

    我的所有文件都具有以下标题 并且它们可以追溯到几年前 我希望能够读取每个文件 然后将文件名中的日期添加为一列 截至 2015 04 01 csv 的文件类型 path C Users filelist os listdir path All
  • 将 CSV 文件导入 PostgreSQL 时忽略引号?

    我正在尝试将制表符分隔的文件导入到我的 PostgreSQL 数据库中 我的文件中的字段之一是 标题 字段 其中偶尔包含实际的引号 例如 我的 tsv 可能如下所示 id title 5 Hello Bleah Foo 是的 标题中只有一个
  • 是否可以在 Mac 上使用 GUI 并行工具查看 git diff?

    我真的很讨厌使用默认的 UNIX 来可视化差异diff工具 是否可以使用 GUI 工具查看 git diff 该工具可以很好地并排显示本地和远程 类似于如何设置mergetool to be DiffMerge当你这样做时 git merg
  • 电子邮件未通过 1and1 smtp 主机 nodemailer caddy 发送

    在我的 Nodejs Express 应用程序中 当新用户注册时 我使用 NodeMailer 发送电子邮件 这是我的电子邮件配置 位于我的 config json 中 senderEmail email senderEmailPasswo
  • 如何更正此 sql 连接上的相关名称?

    我需要一个连接 从两个不同的表中生成三个具有相同名称的字段 当我尝试运行 sql 查询时 VS 给出以下错误 FROM 子句中的对象 PoliticalFigures 和 PoliticalFigures 具有相同的公开名称 使用相关名称来
  • 为什么每个字符串上都有空字符串? [复制]

    这个问题在这里已经有答案了 例如 gt gt gt s python gt gt gt s index 0 gt gt gt s index p 0 这是因为从索引 0 开始的长度为 0 的子串 python 等于空字符串 gt gt gt
  • java regex:从字符串中获取可能变化的子字符串

    我有一个像这样的字符串 Bangalore India Karnataka 我只想从这个字符串中提取子字符串 Bangalore 在这种情况下 正则表达式可以是 但问题是 字符串有时可能只是 Bangalore 那么在这种情况下 上面的正则
  • 为什么 Xcode 在创建地址清理构建时定义 _LIBCPP_HAS_NO_ASAN?

    Xcode 7 允许使用地址清理器来查找 C C 中的内存问题 https github com google sanitizers wiki AddressSanitizer https github com google sanitiz
  • 如何在 Eclipse 中启用 TODO/FIXME/XXX 任务标签?

    在我使用 Eclipse 的这些年里 直到现在我才知道 TODO FIXME XXX 注释标签应该出现在任务列表中 显然 默认情况下这是禁用的 因为只要我使用 Eclipse 我就一直在使用这些标签 而且我从未见过其中一个出现在任务列表中
  • C 中的嵌入式 perl、perlapio - 与 STDIO 的互操作性

    我刚刚意识到 PerlIO 层似乎不仅仅 或多或少 轻松地包装 stdio h 函数 如果我尝试使用通过以下方式解析的文件描述符PerlIO stdout and PerlIO fileno 对于 stdio h 中的函数 这会失败 例如
  • AutoFixture 和私有财产

    我可以指导吗汽车夹具 https github com AutoFixture还可以填充私有属性 并用特定属性进行注释 例如Ninject Inject 所有类别中 来源似乎只扫描公共属性 1 https github com AutoFi
  • 动态数组 - 如何增加数组的大小?

    我正在从文件中读取数字 然后尝试将它们添加到数组中 我的问题是如何增加数组的大小 例如 我认为也许可以这样做 include
  • 通过 CLI 更新 AWS API Gateway 资源策略的语法是否正确?

    我正在尝试通过 CLI 更新 API 网关实例上的资源策略 但我似乎找不到正确的 JSON 语法 在文档中 它说使用 补丁操作 据我了解 它需要一串 JSON 来表示策略 我尝试过缩小 JSON 转义 JSON 单引号 无引号 但似乎都不起
  • 如何卸载附加场景?

    我正在制作一款坦克战游戏 每轮后都会随机生成新的关卡 在我的游戏管理器中 我试图让回合从随机范围索引中的附加加载场景开始 然后以卸载场景结束 然后加载到新的随机场景中 然而 我所做的每一次尝试都会导致某种形式的错误 我一直被引导到 Load
  • 我如何在 Heroku 上安排“每周”工作?

    我在 Heroku 上部署了一个 Rails 应用程序 并使用 Heroku 调度程序插件成功处理日常工作 现在我想要一个每周工作 但调度程序附加组件不允许我每周选择 关于我如何实现这一目标的任何建议 我过去曾尝试使用 rufus sche
  • 折线(路线)悬停时的工具提示

    我已经在地图上标出了路线 使用一些坐标生成的路线 其中包含附加信息 速度 我希望当路线悬停时 会出现一个工具提示并显示这些坐标处的信息 速度 我很困惑如何显示速度的工具提示
  • 领域驱动设计中的 WCF 序列化和值对象模式

    Eric Evans 所著的 领域驱动设计 一书描述了称为值对象的模式 值对象的重要特征之一是它是不可变的 作为一个例子 我有一个值对象 Clinic 其中must有名字和id 为了使其成为值对象 我不提供名称和 ID 的设置器 另外 为了
  • 如何在sql server中的列中存储多个值

    我正在创建职位申请 在我的第一个表中 列是这是我的主表 ID Position jobDescription minExp maxExp LastDate InterviewDate Project HiringManager interv
  • 禁止 GCC 下的不兼容指针类型特定警告

    在 GCC 下的代码中 我收到了很多这两种类型的警告 warning passing argument 1 of foo from incompatible pointer type and warning assignment from