【发布时间】:2022-01-11 08:39:57
【问题描述】:
我有一个小项目,其中包括处理指针数组,为了方便我制作了一个 .h 文件,该文件通过使用 void 指针执行操作然后返回最终产品来处理它,即函数原型类似于@987654323 @。然而,每当我使用这个函数而不明确地将我的指针类型转换为void ** 并返回到它们的原始类型时,gcc 就会在转换时抛出警告。
我正在做的事情不安全吗?我假设 gcc 给我警告一定是有原因的,但据我所知,void ** 与任何其他类型的指针数组相同,因为所有指针都是 8 个字节长(或者不管它们有多长,关键是它们的长度都是一样的),如果我所做的没有问题,有没有办法在每次调用这些函数时无需添加 20 个类型转换字符来抑制警告?
谢谢
【问题讨论】:
-
如果将指针别名为其他指针类型,则行为未定义,即使大小相同。演员表只是使警告静音,它不会使代码安全。
-
在
void *之间进行投射是安全的。这种安全性不会扩展到void **。 -
询问如何抑制警告通常是不好的,可能是危险的。您应该问的问题是如何编写正确的、受支持的代码。为此,您必须为您正在做的事情提供更多背景信息,最好是minimal reproducible example。
-
当你edit你的问题对cmets做出反应时,也请告诉我们你需要多少不同的指针类型。你考虑过使用联合吗?
-
C 允许对象指针隐式转换为类型
void *。涉及指针的所有其他转换都需要强制转换。 GCC 将隐式执行额外的转换,但它会警告它们(至少在某些情况下)。这基本上是一个可移植性警告,诊断将指定控制该特定警告的编译器选项。您所做的绝对是不合格和可疑的,但如果没有更多信息,我们无法判断除可移植性之外的具体风险。