2016-07-23 105 views
1

我已經創建了一個動態數組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 *)而不會將其暴露給可能的修改?

+1

我不明白這一點。用戶如何修改指向析構函數的指針?第一種情況:我調用getter並將結果存儲在局部變量x中。後來我修改了x的內容。現在局部變量指向一個不同的函數。但是存儲在struct Vector中的函數指針仍然指向原始函數。沒問題!第二種情況:我調用getter,將結果存儲在x中。然後我解引用x並修改存儲在其地址中的字節。也就是說,我修改了析構函數的代碼。沒有理智的人會這樣做。 - 你想避免哪種場景? –

+0

你的標題詢問一個函數指針,代碼顯示一個指向'const'的指針,並且你的文本似乎要求一個'const'指針。另外'void *'如何發揮作用?看[問],你的問題相當模糊。 – Olaf

回答

4

嘗試把const旁邊*來代替:

void (*const Vector_type_destructor(const struct Vector *vector))(void *); 
+0

編譯器已經沉默,所以這似乎是正確的答案。你能解釋一下如何將它讀作返回一個const void void(* p)(void *)'的指針嗎? –

+0

我建議閱讀一篇文章,解釋如何讀取C語言中的類型聲明。例如,請參閱https://stackoverflow.com/a/5503393和https://stackoverflow.com/a/89100。 – Rufflewind

+0

謝謝。我通常會讓他們中的大部分人失望,但這只是一個令人討厭的問題。 –