C编程中的跳转/分支表

时间:2014-07-28 16:06:39

标签: c unresolved-external jump-table

请帮助我使用以下代码

//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;
}

问题是代码无法编译时出现链接错误     未解决的符号void __cdecl Jmp_Handler_HELLO(void) 但是,当删除main函数中的第一行代码时,代码会成功编译。请帮助

1 个答案:

答案 0 :(得分:0)

发现问题。每个文件都是一个c文件(.c扩展名),主文件除外是c ++文件(.cc扩展名)。更改主文件的扩展名后,它编译顺利。但是我认为它应该已经编译过,可能任何人都可以回答为什么它没有编译。

感谢@chris和@colonel的回复。