문제

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);

다른 팁

당신은 쓰지 말아야합니까?

typedef void (*PFN_FOO)(int x, int y);

이것 좀 봐 지도 시간.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top