【发布时间】:2019-05-30 20:11:24
【问题描述】:
archives.c: In function ‘fd_writeback_wait’:
archives.c:121:21: warning: passing argument 1 of ‘aio_suspend’ from incompatible pointer type [-Wincompatible-pointer-types]
r = aio_suspend(&cb, 1, NULL);
^~~
In file included from ../lib/dpkg/fsys.h:28,
from ../lib/dpkg/triglib.h:28,
from archives.c:57:
/usr/include/aio.h:168:51: note: expected ‘const struct aiocb * const*’ but argument is of type ‘struct aiocb **’
extern int aio_suspend (const struct aiocb *const __list[], int __nent,
~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
解释:
- Why isn't it legal to convert "pointer to pointer to non-const" to a "pointer to pointer to const"
- ...或查看屏幕右侧的相关问题列表,然后选择:-)。
我认为没有办法避免这个警告,除非编写一个危险的类型转换来更改 const 限定符,或者禁止整个警告类别。
显然 C++ 在这里做得更好。它还有const_cast 用于更清晰的转换,确保您仅更改 const 限定符。
换句话说,POSIX 将aio_suspend() 定义为像这样使用const 可以说是相当危险的。
我的解释正确吗?
如果我错了,那么我该如何避免这个警告,但仍然让编译器检查我只是在转换 const 限定符,而不是转换为完全不兼容的类型?
我怀疑如果有方法,它们不会是我想在实践中使用的方法,但我很好奇。
我正在处理的当前代码没有明确记录所需的编译器版本。
我会对在标准 C 版本中工作的技术感兴趣。我很想听听 GCC 扩展。也欢迎评论是否推荐或不推荐定义这样的函数参数。
提醒读者注意,C 和 C++ 是不同的,不是 100% 兼容的语言。我承认将代码库切换到 C++ 可能会提供一个解决方案,但我认为该解决方案对我来说不是很有用。谢谢。
【问题讨论】: