2016-07-23 2 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 *)) 

가 나는 게터없이 세터를 제공하기 위해 조금 이상했다 느꼈다, 그래서 나는 빨리 다음과 같은 기능을 추가 :이 기능은 기능을 설정합니다. 나는 유형의 소멸자는 세터를 통해 수정되고 싶어, 그리고 반환 된 포인터를 통해 나는이의 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 *)을 반환합니까?

+1

나는 그것을 얻지 않는다. 어떻게 사용자가 소멸자 함수에 대한 포인터를 수정할 수 있습니까? 첫 번째 시나리오 : getter를 호출하고 그 결과를 로컬 변수 x에 저장합니다. 나중에 x의 내용을 수정합니다. 이제 지역 변수는 다른 함수를 가리 킵니다. 그러나 struct Vector에 저장된 함수 포인터는 여전히 원래 함수를 가리 킵니다. 문제 없어! 두 번째 시나리오 : getter를 호출하고 결과를 x에 저장합니다. 그런 다음 x를 역 참조하고 해당 주소에 저장된 바이트를 수정합니다. 즉, 소멸자 함수의 코드를 수정합니다. 제정신이없는 사람은 그렇게하지 않을 것입니다. - 어떤 시나리오를 피하려고합니까? –

+0

당신의 제목은 함수 포인터에 관해 묻고, 코드는'const'에 대한 포인터를 보여 주며, 어쨌든 텍스트는'const' 포인터를 요구하는 것 같습니다. 또한'void *'가 어떻게 작동합니까? [ask]를보십시오, 당신의 질문은 꽤 안개 듭니다. – Olaf

답변

4

시도 대신 * 옆에 const 퍼팅 :

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

컴파일러가 자동 응답을하지 않아 정답이 될 수 있습니다. 이것이'void (* p) (void *)'의 const 포인터를 반환하는 것으로 읽는 방법을 설명해 주시겠습니까? –

+0

C에서 타입 선언을 읽는 방법을 설명하는 기사를 읽는 것이 좋습니다. 예를 들어, https://stackoverflow.com/a/5503393 및 https://stackoverflow.com/a/89100을 참조하십시오. – Rufflewind

+0

감사합니다. 나는 대개 그 (것)들의 대부분을 가지고있다, 그러나 이것은 다만 더럽다. –

관련 문제