首页 > 解决方案 > 两个本应兼容的函数指针类型被警告为不兼容。我违反了什么规则?

问题描述

我有一组函数用于对大整数执行无符号模乘法。出于某种原因,当我在乘法中使用我的通用余数函数时,编译器(我正在使用带有-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);
                    ^~~~~~~~~~~~~~~~~~

我在这里打破了什么规则?

标签: ctypeswarnings

解决方案


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_tconstness 应该匹配(并且可能还有指针参数的ness restrict,这也是不同的)以匹配指针类型。


推荐阅读