2014-07-28 5 views
0

는 친절하게 다음의 코드 조각을 도와점프/분기 표

//jmp_common.h 

typedef void (*jmp_Handler_t)(void); 

#define JMP_CMD_HANDLER(com) extern void Jmp_Handler_##com(void) 

#define JMP_DEF_COM(com) extern void Jmp_Handler_##com(void); 

#include "jmp_cmd_list.h" 

#undef JMP_DEF_COM 

typedef struct JmpStruct 
{ 
    char * name; 
    jmp_Handler_t handler; 
}JmpStruct_t; 

/*********************************/ 
/*********************************/ 

//jmp_cmd_list.h 

JMP_DEF_COM(HELLO) 
JMP_DEF_COM(WORLD) 

/*********************************/ 
/*********************************/ 

//jmp_cmd_handlers.c 

#include "jmp_common.h" 

JMP_CMD_HANDLER(HELLO) 
{ 
    int a = 100; 
} 

JMP_CMD_HANDLER(WORLD) 
{ 
    int a = 100; 
} 

/*********************************/ 
/*********************************/ 

//main.c 
#include "jmp_common.h" 

#define JMP_DEF_COM(com) { #com , Jmp_Handler_##com }, 

const JmpStruct_t JumpTable[/*JMP_CMD_MAX*/2] = { 
#include "jmp_cmd_list.h" 
}; 

int main(void) 
{ 
    JumpTable[0].handler(); 
    return 0; 
} 

문제는 코드가 링크 오류로 Jmp_Handler_HELLO (무효) __cdecl 해결되지 않은 기호 무효를 컴파일 실패를인가 그러나 주 기능 코드의 첫 번째 줄을 제거하면 코드가 성공적으로 컴파일됩니다. 친절하게 도와주세요

+0

이름을 모두 'HELLO'로 지정 했으므로이 이름은'Jmp_Handler_HELLO'입니다. –

+0

tankyou하지만 불행히도 오타가 잘못되었습니다. 이것은 실제 상황과 관련이 없습니다. 감사합니다. – theadnangondal

+2

'jmp_cmd_handlers.o'에서 링크하는 것을 잊었습니까? 거기에 정의되어 있어야하므로 ('nm jmp_cmd_handlers.o') 제대로되었는지 확인하십시오. –

답변

0

발견. 모든 파일은 C++ 파일 (.cc 확장자) 인 주 파일을 제외하고는 c 파일 (.c 확장자)이었습니다. 메인 파일의 확장자를 변경 한 후 부드럽게 컴파일됩니다. 그러나 나는 그것이 전에 컴파일해야한다고 생각합니다. 왜 컴파일되지 않았는지 누구든지 대답 할 수 있습니다.

답장을 위해 @kyris와 @colonel이 (가) 있습니다.