我已經創建了一個動態數組struct Vector
,它的內部是我對用戶隱藏的。相反,提供的功能與他們進行互動,如如何返回一個函數指針爲const?
bool Vector_push(struct Vector *vector, const void *value)
爲了幫助元素的爆裂,該結構具有指向,妥善刪除每個元素的功能。此功能設置與功能:
void Vector_set_type_destructor(struct Vector *vector, void (*type_destructor)(void *))
我覺得這是一個有點奇怪提供一個setter沒有消氣,所以趕緊增加了以下功能。
const void (*Vector_type_destructor(const struct Vector *vector))(void *);
通知我如何添加const
關鍵字,因爲我想要的類型的析構函數只通過setter是修改的,而不是通過返回的指針。不過,我從叮噹處收到以下警告。
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;
如何通過函數正確返回指針void (*type_destructor)(void *)
而不會將其暴露給可能的修改?
我不明白這一點。用戶如何修改指向析構函數的指針?第一種情況:我調用getter並將結果存儲在局部變量x中。後來我修改了x的內容。現在局部變量指向一個不同的函數。但是存儲在struct Vector中的函數指針仍然指向原始函數。沒問題!第二種情況:我調用getter,將結果存儲在x中。然後我解引用x並修改存儲在其地址中的字節。也就是說,我修改了析構函數的代碼。沒有理智的人會這樣做。 - 你想避免哪種場景? –
你的標題詢問一個函數指針,代碼顯示一個指向'const'的指針,並且你的文本似乎要求一個'const'指針。另外'void *'如何發揮作用?看[問],你的問題相當模糊。 – Olaf