c - 避免警告:预期的“const struct aiocb * const*”,但参数的类型为“struct aiocb **”
问题描述
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,
~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
说明:
- 为什么将“指向非 const 的指针”转换为“指向 const 的指针”是不合法的
- ...或查看屏幕右侧的相关问题列表,然后选择:-)。
我认为没有办法避免这个警告,除非编写一个危险的类型转换来更改 const 限定符,或者禁止整个警告类别。
显然 C++ 在这里做得更好。它还具有const_cast
更清晰的强制转换功能,可确保您只更改 const 限定符。
换句话说,POSIX 定义aio_suspend()来const
这样使用可以说是相当危险的。
我是否正确解释了这一点?
如果我错了,那么我怎样才能避免这个警告,但仍然让编译器检查我只是在转换const
限定符,而不是转换为完全不兼容的类型?
我怀疑如果有方法,它们不会是我想在实践中使用的方法,但我很好奇。
我正在处理的当前代码没有明确记录所需的编译器版本。
我会对在标准 C 版本中工作的技术感兴趣。我很想听听 GCC 扩展。也欢迎评论是否推荐或不推荐定义这样的函数参数。
提醒读者注意,C 和 C++ 是不同的,并不是100% 兼容的语言。我承认将代码库切换到 C++ 可能会提供一个解决方案,但我认为该解决方案对我来说不是很有用。谢谢你。
解决方案
这是一种适当调用函数的方法const
:
struct aiocb cb;
const struct aiocb * cblist[1] = { &cb };
aio_suspend(cblist, 1, NULL);
或者:
struct aiocb cb;
const struct aiocb * cbptr = &cb;
aio_suspend(&cbptr, 1, NULL);
请注意,之所以提出上述答案,是因为您使用了以下语法:
r = aio_suspend(&cb, 1, NULL);
将地址传递cb
给期望指向指针的指针意味着指针cb
是指针,因此此调用仅对单个元素数组有意义。
假设你的警告是因为你实际上有这个:
struct aiocb *cbv[256];
r = aio_suspend(cbv, 256, NULL);
删除警告很容易。使用(void *)
.
r = aio_suspend((void *)cbv, 256, NULL);
但是,最好首先定义要使用指针的向量const
。
const struct aiocb *cbv[256];
r = aio_suspend(cbv, 256, NULL);
如果每个回调实例在现实中确实是可修改的(例如,由 分配malloc
),那么只需在修改之前丢弃 const 即可。
struct aiocb *cb = (struct aiocb *)cbv[i];
/* ... modify cb ... */
推荐阅读
- java - 如何基于在最小/最大范围之外的 jSpinner 中的文本字段的无效手动编辑触发事件
- angular - 如何使用角度从同步融合的调度程序获取数据?
- javascript - 如何在单击事件和使用 Vanilla JavaScript 加载新页面后滚动到元素
- python - 如何解决 Flask 中“长时间”渲染模板、“超时错误”、“多用户错误”问题?
- angular - Angular 8:错误类型错误:“ptf.getCompositeKey 不是函数”
- java - ConstraintViolationException 和 MethodArgumentNotValidException 有什么区别
- python - 使用请求后从 json 中抓取数据
- javascript - JavaScript,if-else 简写更好的代码
- azurekinect - Azure Kinect 绿屏
- python - 为什么我不能从安装目录以外的任何地方导入 cv2?