경고 포인터와 포인터 간 기능 사이의 유형 주사
문제
C 코드를 Ti DSP 칩 환경으로 포팅하고 있습니다. 나는 C 컴파일러와 함께 잡고있다.
기능에 대한 포인터가 포함 된 데이터 구조가 있습니다. 데이터 구조를 초기화하는 기능이 있습니다. 이 같은:
typedef void (*PFN_FOO)(int x, int y);
struct my_struct
{
PFN_FOO pfn;
};
init_struct(struct my_struct *p, void *pfn)
{
p->pfn = (PFN_FOO)pfn;
}
Visual Studio와 GCC에서 이러한 종류의 코드는 불만없이 컴파일됩니다. 사실, 왜냐하면 pfn
인수는 유형입니다 void *
나는 거기에 캐스트를 넣을 필요조차 없습니다. 불만없이 암시 적으로 캐스트 될 것입니다.
Ti DSP 칩의 코드 작곡가 스튜디오에서 "경고 : 유효하지 않은 유형 변환"을 얻습니다.
내 정책은 경고없이 코드를 컴파일하는 것이므로이 문제를 해결하고 싶습니다. 나는 모든 종류의 캐스팅을 시도했습니다. 캐스팅하면 컴파일러가 완벽하게 행복하다는 것을 알게되었습니다. void *
포인터 int
먼저 올바른 유형으로 캐스팅하십시오. EW, yuck!
컴파일러가 불만 없이이 캐스트를 어떻게 할 수 있습니까? 나는 정말로 캐스팅해야합니까? int
컴파일러를 닥치기 위해?
참고 : 저는 구체적으로 있습니다 ~ 아니다 "변화의 효과에 대한 해결책을 찾고 init_struct()
수락하려면 PFN_FOO
대신 a void *
".이 단순화 된 코드 스 니펫에는 효과가 있지만 실제 코드에는 효과가 없으며 이기종의 목록을 작성합니다.
해결책
표준 C는 구체적으로 포인터 간의 데이터 개체와 함수에 대한 포인터 간의 전환을 지원하지 않습니다. GCC 및 Visual Studio는 이것을 확장으로 지원합니다.
기능 표준 정보를 만들고 싶다면 (그러나 여전히 사용하십시오. void *
매개 변수), 대신 기능 포인터에 포인터를 전달할 수 있습니다. 기능 포인터 자체가 일반적인 객체이기 때문에 작동하므로 기능 포인터에 대한 포인터를 변환 할 수 있습니다. void *
괜찮아요 :
init_struct(struct my_struct *p, void *pfn)
{
PFN_FOO *foo = pfn;
p->pfn = *foo;
}
그런 다음 발신자는 임시를 만들어야합니다 PFN_FOO
호출 할 때 포인터를 전달하려면 다음과 같습니다.
PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);
다른 팁