동적 인 배열 struct Vector
을 만들었습니다. 내부 배열은 사용자로부터 숨겨져 있습니다. 대신, 기능 요소의 터지는 돕기 위해함수 포인터를 const로 반환하려면 어떻게해야합니까?
bool Vector_push(struct Vector *vector, const void *value)
등, 그들과 상호 작용을 제공, 구조체가 제대로 각 요소를 삭제하는 기능에 대한 포인터를 보유하고 있습니다.
void Vector_set_type_destructor(struct Vector *vector, void (*type_destructor)(void *))
가 나는 게터없이 세터를 제공하기 위해 조금 이상했다 느꼈다, 그래서 나는 빨리 다음과 같은 기능을 추가 :이 기능은 기능을 설정합니다. 나는 유형의 소멸자는 세터를 통해 수정되고 싶어, 그리고 반환 된 포인터를 통해 나는이의 const
키워드를 추가하는 방법을
const void (*Vector_type_destructor(const struct Vector *vector))(void *);
알 수 있습니다. 그러나 나는 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;
어떻게 제대로 할 수 수정에 노출시키지 않고 기능을 통해 포인터 void (*type_destructor)(void *)
을 반환합니까?
나는 그것을 얻지 않는다. 어떻게 사용자가 소멸자 함수에 대한 포인터를 수정할 수 있습니까? 첫 번째 시나리오 : getter를 호출하고 그 결과를 로컬 변수 x에 저장합니다. 나중에 x의 내용을 수정합니다. 이제 지역 변수는 다른 함수를 가리 킵니다. 그러나 struct Vector에 저장된 함수 포인터는 여전히 원래 함수를 가리 킵니다. 문제 없어! 두 번째 시나리오 : getter를 호출하고 결과를 x에 저장합니다. 그런 다음 x를 역 참조하고 해당 주소에 저장된 바이트를 수정합니다. 즉, 소멸자 함수의 코드를 수정합니다. 제정신이없는 사람은 그렇게하지 않을 것입니다. - 어떤 시나리오를 피하려고합니까? –
당신의 제목은 함수 포인터에 관해 묻고, 코드는'const'에 대한 포인터를 보여 주며, 어쨌든 텍스트는'const' 포인터를 요구하는 것 같습니다. 또한'void *'가 어떻게 작동합니까? [ask]를보십시오, 당신의 질문은 꽤 안개 듭니다. – Olaf