c - 两个本应兼容的函数指针类型被警告为不兼容。我违反了什么规则?
问题描述
我有一组函数用于对大整数执行无符号模乘法。出于某种原因,当我在乘法中使用我的通用余数函数时,编译器(我正在使用带有-Wall -Wextra
警告标志的 Clang)给出不兼容的指针警告。
标题:
typedef struct {
uint32_t c;
uint32_t v[];
} vlong_t; // generic incomplete type.
vlong_t *vlong_remv_inplace(vlong_t *rem, const vlong_t *b);
typedef void *(*vlong_modfunc_t)(
vlong_t *restrict v,
void *restrict ctx);
vlong_t *vlong_mulv(
vlong_t *restrict out,
const vlong_t *a,
const vlong_t *b,
vlong_modfunc_t modfunc,
void *restrict mod_ctx);
发出警告的测试代码部分:
vlong_mulv(x, a, b, vlong_remv_inplace, b);
我已经稍微简化了代码以创建一个最小的工作示例,我的编码风格有不同的变量命名约定。
警告如下:
vlong-test.c:85:20: warning: incompatible pointer types passing 'vlong_t *(vlong_t *, const vlong_t *)' to parameter of type 'vlong_modfunc_t'
(aka 'void *(*)(vlong_t *restrict, void *restrict)') [-Wincompatible-pointer-types]
vlong_mulv(x, a, b, vlong_remv_inplace, b);
^~~~~~~~~~~~~~~~~~
我在这里打破了什么规则?
解决方案
vlong_t *vlong_remv_inplace(vlong_t *rem, const vlong_t *b);
typedef void *(*vlong_modfunc_t)(
vlong_t *restrict v,
void *restrict ctx);
vlong_t *vlong_mulv(
vlong_t *restrict out,
const vlong_t *a,
const vlong_t *b,
vlong_modfunc_t modfunc,
void *restrict mod_ctx);
该函数vlong_remv_implace
接受一个指向 的指针vlong_t
和一个指向 的指针const vlong_t
,而vlong_modfunc_t
类型描述了一个指向函数的指针,该函数接受一个受限指针vlong_t
和一个指向非 的受限指针const
vlong_t
。const
ness 应该匹配(并且可能还有指针参数的ness restrict
,这也是不同的)以匹配指针类型。
推荐阅读
- java - 方法是否与对象一起实例化?
- django - docker-entrypoint-initdb.d 中的脚本 sql 未执行
- angular - 如何在Angular中为switch case编写单元测试用例?
- three.js - 如何在不使用 Threejs 的情况下使用 WebGL 加载 glb 文件
- java - 如何使用租户 ID、客户端 ID 和客户端密码连接和管理 Azure Data Lake Storage Gen2 中的目录和文件?
- python - 如何在给定网站中抓取表格?
- java - Java中的Csv到Json转换
- c# - 获取控件中 ViewModel 中使用的 BindableProperty 的值?
- reactjs - 有条件地要求使用 React Native 和 TypeScript 的图像资产的正确方法是什么?(得到 eslint 错误)
- javascript - 扩大未捕获的 AppSync 订阅(承诺中)