繁体   English   中英

抑制从 void ** 到另一个 ** 的隐式类型转换的警告的方法?

[英]Way to supress warning for implicit typecasting from void ** to another **?

我有一个小项目,其中包括处理指针 arrays,为了方便我制作了 ah 文件,通过使用 void 指针进行操作然后返回最终产品来处理它,即 function 原型类似于void **ptr_array_add(void **ptr_array, void *new_ptr); . 但是,每当我使用此 function 而不明确地将我的指针转换为void **并返回其原始类型时,gcc 都会在转换时引发警告。

我正在做的事情不安全吗? 我假设 gcc 给我警告肯定是有原因的,但据我所知, void **与任何其他类型的指针数组相同,因为所有指针都是 8 字节长(或者不管它们有多长,关键是它们的长度都相同),如果我所做的没有问题,有没有办法在每次调用这些函数时无需添加 20 个类型转换字符来抑制警告?

谢谢

C 类型系统只有一种特殊的通用指针,即void*并且只有那个。 但是,这不适用于“递归”; void**没有什么特别之处。 因此,您可以分配给void**的唯一类型是另一个void**void*的地址。

因此,为了使用您发布的 function,您需要在调用方声明一个void* ,将其传递给 function,然后将void*转换为相关的 ZA8CFDE6331BD59EB66AC96F8911 指针:

void* tmp;
... ptr_array_add(&tmp, ...);
int* some_other_pointer = tmp; // assuming that the actual data type is indeed int

我正在做的事情不安全吗?

是的,如果指针被取消引用为其他类型而不是它实际指向的类型,则通过强制转换为“关闭警告”来强制执行无效指针转换将导致未定义的行为。 具体问题是严格的指针别名、指针大小和指针的陷阱表示,所有这些在理论上都会产生微妙的错误和崩溃。

但在实践中,非外来系统上的大多数指针很可能在内部具有相同的大小和表示。 像 CUDA 这样的一些库甚至在void**和其他指针对指针之间使用脏强制转换作为 API 的一部分。 但是 C 标准不支持保证您这样做时的任何确定性行为。

如果这是一个指针一个接一个的数组,您可以将签名更改为使用 void*。 我做了一个简单的例子,将新指针写入数组的第二个条目并返回数组的旧开始。

void* ptr_array_add(void* ptr_array, void* new_ptr) {
    void** entries = (void**)ptr_array;
    entries[1] = new_ptr;
    return (void*)entries;
}

所有铸件现在都在 function 内。 您的用户代码必须将数组保持为 void*。

如果您还想将返回值强制转换为特定类型,例如 int**,则无法自动完成。

您必须为您使用的每种类型创建特定的包装器。 使用 C++ 编译器会有模板。

对于 C,您只能使用预处理器宏来自动创建包装函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM