我如何 return 一个函数指针作为 const?
How do I return a function pointer as const?
我创建了一个动态数组 struct Vector
,我对用户隐藏了它的内部结构。取而代之的是提供函数与它们进行交互,例如
bool Vector_push(struct Vector *vector, const void *value)
为了帮助弹出元素,该结构包含一个指向正确删除每个元素的函数的指针。这个函数是用函数设置的:
void Vector_set_type_destructor(struct Vector *vector, void (*type_destructor)(void *))
我觉得提供一个setter而没有一个getter有点奇怪,所以我很快添加了以下功能。
const void (*Vector_type_destructor(const struct Vector *vector))(void *);
请注意我是如何添加 const
关键字的,因为我希望类型析构函数只能通过 setter 修改,而不是通过 returned 指针修改。但是,我收到了来自 clang 的以下警告。
src/Vector.c:184:66: warning: function cannot return qualified void type
'const void' [-Wqualified-void-return-type]
const void (*Vector_type_destructor(const struct Vector *vector))(void *) {
^
src/Vector.c:185:12: warning: incompatible pointer types returning
'void (*const)(void *)' from a function with result type
'const void (*)(void *)' [-Wincompatible-pointer-types]
return vector->type_destructor;
如何通过函数正确 return 指针 void (*type_destructor)(void *)
而不将其暴露给可能的修改?
尝试将 const
放在 *
旁边:
void (*const Vector_type_destructor(const struct Vector *vector))(void *);
我创建了一个动态数组 struct Vector
,我对用户隐藏了它的内部结构。取而代之的是提供函数与它们进行交互,例如
bool Vector_push(struct Vector *vector, const void *value)
为了帮助弹出元素,该结构包含一个指向正确删除每个元素的函数的指针。这个函数是用函数设置的:
void Vector_set_type_destructor(struct Vector *vector, void (*type_destructor)(void *))
我觉得提供一个setter而没有一个getter有点奇怪,所以我很快添加了以下功能。
const void (*Vector_type_destructor(const struct Vector *vector))(void *);
请注意我是如何添加 const
关键字的,因为我希望类型析构函数只能通过 setter 修改,而不是通过 returned 指针修改。但是,我收到了来自 clang 的以下警告。
src/Vector.c:184:66: warning: function cannot return qualified void type
'const void' [-Wqualified-void-return-type]
const void (*Vector_type_destructor(const struct Vector *vector))(void *) {
^
src/Vector.c:185:12: warning: incompatible pointer types returning
'void (*const)(void *)' from a function with result type
'const void (*)(void *)' [-Wincompatible-pointer-types]
return vector->type_destructor;
如何通过函数正确 return 指针 void (*type_destructor)(void *)
而不将其暴露给可能的修改?
尝试将 const
放在 *
旁边:
void (*const Vector_type_destructor(const struct Vector *vector))(void *);