C语言 强制 GCC 在将浮点指针转换为 int 指针时报告警告?


void foo(uint32_t* p);
...
float32_t* x;
foo( (uint32_t*)x );

静态代码分析工具报告“casting from float* to integer*"问题。

如何强制 GCC 编译器报告相同的警告?

编译器选项包括:-pedantic -Wall -Wextra -Wconversion

通过使用显式转换("强制转换"(,您已经告诉编译器:">我绝对想这样做"。这就是演员表的含义。编译器对此发出警告是没有意义的。

相反,依赖于隐式转换,如果您尝试使用无效的转换,则程序的编译将失败,直到您修复它。

现在,这只会在您编写程序时为您提供帮助。它不能帮助您静态分析已经存在的编写不佳的代码,以改进代码。嗯,没关系!这就是您的静态分析仪的用途,正如您已经发现的那样。🤪

话虽如此,如果您启用了严格的别名,编译器执行自己的一些静态分析,并且如果您的程序无法按预期工作的风险,可能会在此处发出警告。但是,在 GCC 构建中通常会禁用严格的混叠,即使没有禁用,检测混叠冲突也很复杂,无法保证。

我怀疑你会找到你正在寻找的编译器选项。 (在我看来,您正在寻找的编译器选项应该不存在。

通常的问题是:

我在做一些奇怪的事情。 我知道没关系,但编译器不断警告它。 如何禁用警告?

现在,如果您正在做的"奇怪的事情"是以可能不安全的方式混合和匹配不兼容的指针,那么禁用警告的方法通常是:使用显式强制转换

因此,实际上,您所要求的是一种通过使用显式强制转换来重新启用您(或某人(已经禁用的警告的方法,毕竟您现在认为这是错误的转换。

我们正处于无限倒退的风口浪尖。 如果有一种方法可以警告显式强制要求进行的可疑转换,那么下周我们将收到这个问题:

我正在使用名义上不兼容的指针之间的特殊转换。 我知道没关系,但是编译器不断警告它,即使我使用的是显式强制转换。 如何禁用警告? 我需要使用两个石膏吗?

这有点像警告消息。 假设您尝试删除重要的系统文件。 假设您的计算机弹出一个警告对话框,说"即将删除重要文件。确认? 假设您决定不想删除它,但您不小心单击了"确定"按钮,文件就会消失。 您是否发现自己希望警告对话框之后是第二个对话框,询问"您真的确定吗? 您可能会,但大多数人可能会同意,每当他们删除文件时必须单击两次"确定"将是不可接受的麻烦......

最新更新