일부 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;
}
이 종류의 코드는 불만없이 컴파일됩니다. 사실, pfn
인수가 void *
유형이기 때문에 거기에 캐스트를 넣을 필요가 없습니다. 그것은 단지 불만없이 암시 적으로 던질뿐입니다. TI의 DSP 칩의 코드 컴포저 스튜디오 (Code Composer Studio)에서
내 정책이 내 코드가 경고없이 컴파일 할 수 있도록하는 것입니다, 그래서 나는이 문제를 해결하려면. 나는 모든 종류의 주조를 시도했다. 나는 내 void *
포인터를 int
포인터로 먼저 캐스팅 한 다음 올바른 유형으로 캐스트하면 컴파일러가 완벽하게 행복하다는 것을 발견했습니다. Ew, yuck!
컴파일러없이이 캐스트를 어떻게 할 수 있습니까? 컴파일러를 종료하려면 실제로 int
으로 캐스트해야합니까?
참고 : 나는의 효과에 대한 해결책을 찾고 특히 하지이다 "대신 void *
의 PFN_FOO
받아 init_struct()
변경". 이 단순화 된 코드 스 니펫에서는 작동하지만 실제 코드에서는 작동하지 않을 수 있습니다.이 코드는 이기종이기는 가능한 목록을 작성합니다.
올바른 형식 계약을 체결하고 pfn 유형 PFN_FOO를 작성하는 것이 더 간단하지 않습니까? 또 다른 포인트 - init_struct()에 명시적인 타입을 부여해야합니다. VC++ 2008에서도 C 컴파일을 사용하여 경고없이 컴파일되지 않습니다. – Clifford
@Clifford, 내 실제 코드는 항상 함수에 명시적인 형식이 있습니다. 경고없이 컴파일 할 코드를 작성하고 유형에주의해야합니다. 문제는 내가 이질적인 물건을 가질 수있는 데이터 구조를 초기화하는 함수를 만드는 것입니다, 그리고 그것의 내부에 저장된 가능한 유형의 데이터 당 하나의 init 함수가 아니라 하나의 init 함수를 원합니다. – steveha