C程序设计中的跳转/分支表

C程序设计中的跳转/分支表,c,unresolved-external,jump-table,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 typede

请帮助我完成以下代码

//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\uu cdecl Jmp\u Handler\u HELLOvoid
但是,当删除主函数中的第一行代码时,代码将成功编译。请帮助

找到问题。每个文件都是一个C文件.C扩展,除了主文件,它是C++文件.cc扩展名。在更改主文件的扩展名后,它编译得很顺利。但我认为它应该已经编译过了,也许任何人都可以回答为什么它没有编译


谢谢@chris和@collone的回复。

名字应该是Jmp_Handler_HELLO,因为你在所有caps中都指定了HELLO。谢谢你,但不幸的是,这只是一个打字错误。这与实际情况无关。谢谢你忘了链接jmp_cmd_handlers.o了吗?应该在那里定义它,因为这是您定义它的地方,所以请检查以确保它是nm jmp_cmd_handlers.o,并且链接正确。谢谢Chris的回答。jmp_cmd_handler.c是VisualStudio解决方案的一部分,我正在通过VisualStudioGUI选项而不是VisualStudio命令提示符进行编译,因此我认为这不会是一个问题。此外,如前所述,JumpTable结构已成功编译,如果删除main函数中的行,则代码将被编译。但是我不完全确定,您可能是对的,请详细阐述您的观点,以便我可以尝试一下。谢谢您@chrisdodd而且所有处理程序函数都在头文件jmp_common.h define jmp_DEF_COMcom extern void jmp_handlercomvoid中获取extern;包括jmp_cmd_list.h undef jmp_DEF_COM