2009-10-12 3 views
6

일부 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() 변경". 이 단순화 된 코드 스 니펫에서는 작동하지만 실제 코드에서는 작동하지 않을 수 있습니다.이 코드는 이기종이기는 가능한 목록을 작성합니다.

+0

올바른 형식 계약을 체결하고 pfn 유형 PFN_FOO를 작성하는 것이 더 간단하지 않습니까? 또 다른 포인트 - init_struct()에 명시적인 타입을 부여해야합니다. VC++ 2008에서도 C 컴파일을 사용하여 경고없이 컴파일되지 않습니다. – Clifford

+0

@Clifford, 내 실제 코드는 항상 함수에 명시적인 형식이 있습니다. 경고없이 컴파일 할 코드를 작성하고 유형에주의해야합니다. 문제는 내가 이질적인 물건을 가질 수있는 데이터 구조를 초기화하는 함수를 만드는 것입니다, 그리고 그것의 내부에 저장된 가능한 유형의 데이터 당 하나의 init 함수가 아니라 하나의 init 함수를 원합니다. – steveha

답변

12

표준 C는 특히 데이터 개체에 대한 포인터와 함수에 대한 포인터 간의 변환을 지원하지 않습니다. GCC와 Visual Studio는이를 확장으로 지원합니다.

함수를 표준 준수 (그러나 여전히 void * 매개 변수 사용)하려면 함수 포인터 대신 포인터를 전달할 수 있습니다.

init_struct(struct my_struct *p, void *pfn) 
{ 
    PFN_FOO *foo = pfn; 
    p->pfn = *foo; 
} 

다음 임시 PFN_FOO 객체를 생성해야합니다 호출자는 때를 포인터를 전달 : 함수가 너무 함수 포인터에 대한 포인터와 잘 void *에서 변환 할 수 있습니다, 자신이 보통의 객체 포인터 때문 작동 전화를 걸 때 :

PFN_FOO fp = &somefunc; 
/* ... */ 
init_struct(p, &fp); 
+0

와우,이게 TI C 일이라고 생각했는데, 그게 C 표준 일이라고 말하고있는거야. 매우 도움이됩니다. – steveha

+1

자, 이제 함수를 다시 작성하여'void *'대신에'typedef void (* PFN)();'로 정의 된'PFN'을 취합니다. 그러면 경고없이 컴파일됩니다. 특정 PFN 유형으로 변환되기 전에 함수에 대한 포인터로 시작하는 것으로 충분합니다. 고맙습니다! 대답은 받아 들여지고 +1. – steveha

+0

맞습니다. 다른 함수 포인터 유형간에 자유롭게 변환 할 수 있습니다. – caf

3

작성 하시겠습니까?

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

tutorial를 참조하십시오.

+0

어, 예. 나는 실제 코드에서 맞다. 바보 같은 예제 코드를 바꿀 것이다. 자, 실제 질문에 대한 조언이 있습니까? – steveha

+0

명확히하기 위해 : 문제가 PFN_FOO 유형을 올바르게 선언하지 않은 코드라고 의심되었을 수 있습니다. 그건 문제가 아니며 코드는 실제로 잘 작동하지만 TI DSP C 컴파일러가 경고를 내고 있습니다. – steveha

+0

C 또는 C++로 컴파일 중입니까? – dirkgently