gpt4 book ai didi

带有 const 参数的函数指针可以用作带有非常量参数的函数指针吗?

转载 作者:太空狗 更新时间:2023-10-29 16:32:42 25 4
gpt4 key购买 nike

也许标题本身并不清楚......我有一个函数 f(由某个库提供)将签名为 void g(int*) 的函数指针作为参数,即

void f(void (*g)(int*));

但是,我想使用带有签名 void g(const int*) 的函数 g(我定义的)来使用它。先验的,我看不出这怎么会违反任何常量正确性,因为 f 的所有签名都说 g 只会用(非-const) int*(非const),事实上我可以调用一个void (const int*) 使用非 const int* 参数的函数。

但是 GCC 提示说,

expected 'void (*)(int *)', but argument is of type 'void (*)(const int *)'

我看不出这个投诉怎么合理,所以有谁知道我的理解是否错误,或者是否有解决办法?

最佳答案

您似乎发现了一些编译器编写者和标准编写者没有考虑到的东西。来自 C99 草案 n1256,§6.7.5.3 第 15 段,

corresponding parameters shall have compatible types.

请注意,const int *int * 不兼容。但是,int * 可能会转换为 const int *。来自 §6.3.2.3,第 2 段,

For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to the q-qualified version of the type

用于推断何时可以接受从同一类型的合格或非合格版本派生的类型的更复杂规则根本不存在于标准中。因此,您的代码在技术上违反了标准。

我的结论:在我看来,这个错误应该被编译器视为“迂腐”:您的代码技术上不符合标准,但是含义明确,代码绝对安全。请随时向您的编译器供应商提出功能请求。如果没有 -pedantic,有很多不一致的做法不会生成警告。

作为最后的说明,我使用 Clang 进行编译,编译器告诉我警告是迂腐的。但是,我没有请求迂腐的警告...所以似乎没有办法将其关闭。

warning: incompatible pointer types passing 'void (int const *)', expected 'void (*)(int *)'      [-pedantic]

Workaround: Use an explicit cast.

void g(const int *);

f((void (*)(int *)) g);

关于带有 const 参数的函数指针可以用作带有非常量参数的函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com