2012-05-15 6 views
1

현재 함수 포인터를 콜백으로 사용하고있는 코드가 있습니다. 이 사실 인 TinyOS의 nesC 그 언어를 사용하는C 함수 포인터 변수 타입 클래스에 지정된 에러 저장 클래스

error_t addCommand(uint8_t command, void (*callback)(uint16_t,uint8_t)){ 

하지만이 것 같다 : 나는 코드의 관련 부분은 " '스토리지 클래스는 매개 변수'유형 이름을 지정"라는 GCC에서 오류에 문제가 있어요 C 문제. 문제에 대한 내 연구에서 나는 대부분 한 두 문제로 인한 제안 발견 : 헤더에 잘못된

  1. 뭔가 (실종 세미콜론)
  2. 이 (정적 또는 휘발성 값으로 함수 포인터를 전달을 즉 void (*callback)(volatile int, uint8_t)
  3. 방법에 내가 지금까지 내가 말할 수있는 문제 하나를 제거했다

. 문제 2 uint16_t 또는 uint8_t (나는 이러한 유형의 많은 경험이없는) 휘발성의 정적 경우에만 문제입니다. 모든 팁/답변 이 문제를 해결하기 위해 크게 감사하겠습니다.

사람이 nesC 그 익숙한 경우

또한, 정확한 코드는 더 다음과 같습니다

command error_t CommandEngine.addCommand(uint8_t command, 
             void (*callback)(uint16_t,uint8_t)) { 

무엇 NesC로는 C 언어에 추가하는 것은이 에러의 원인이 가능할 수도 있지만, 난이 생각하지 않습니다 경우.

EDIT : 어떤 방식 으로든 nesC였습니다. 명령이 nesC에서 사용되고 컴파일 전에 C 코드의 일부 블록으로 변환 될 때 변수 이름으로 명령을 사용하고있는 것으로 나타났습니다. 이로 인해 C 코드로 변환하는 아이디어에 대해 모두에게 감사 드리며 이로 인해이 문제가 실현되었습니다. 나는 이것을 정말로 생각해야만했다.

+0

void (* 콜백) (uint16_t, uint8_t) - 형식이 아닌가요? 함수 정의 중에 여기에 매개 변수 이름을 사용해서는 안됩니까? – Jay

+0

또 다른 스토리지 클래스는'extern'이므로'extern'이 올바르게 사용되지 않는 경우가 있는지 살펴보십시오. – acraig5075

답변

0

일반적으로 함수 포인터에 typedef를 사용하는 것이 좋습니다. 그것은 당신의 문제를 해결할 수 있으며, 반드시 더 많은 읽을 수 :

typedef void (*callback_t)(uint16_t,uint8_t); 
error_t addCommand(uint8_t command, callback_t callback)){ 

이 문제가 해결되지 않을 경우, 그것은 적어도 범위를 좁힐 것 - 문제가 타입 정의와 경우에 당신이 볼 수 있습니다 또는 기능.

또한 nesC (나도 모르는 부분) 또는 C인지 확인해야합니다. nesC 특정 부분을 제거하고 gcc로 컴파일하려고 시도하고 어떤 일이 발생하는지 확인하십시오.

+0

다른 주석도이를 언급하는 데 도움이되었지만 nesC 특정 부분을 제거하면 nesC (command)에 예약어를 함수 인수 이름으로 사용했음을 알게되었습니다. 이것은 gcc 컴파일러에 보내기 전에 C 블록으로 확장되었습니다. 고맙습니다. –