【问题标题】:Jump/Branch Table in C ProgrammingC编程中的跳转/分支表
【发布时间】:2014-09-19 21:14:31
【问题描述】:

请帮助我使用以下代码

//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) 但是,当删除主函数中的第一行代码时,代码编译成功。请帮忙

【问题讨论】:

  • 名称将是Jmp_Handler_HELLO,因为您指定了所有大写的HELLO
  • tankyou 你,但不幸的是这只是一个拼写错误。这与实际情况无关。还是谢谢
  • 您忘记链接jmp_cmd_handlers.o了吗?它应该在那里定义(因为那是您定义它的地方),因此请检查以确保它是 (nm jmp_cmd_handlers.o) 并正确链接。
  • 感谢克里斯的回答。 jmp_cmd_handler.c 是 Visual Studio 解决方案的一部分,我正在通过 Visual Studio gui 选项(而不是 Visual Studio 命令提示符)进行编译,所以我认为这不是问题。此外,如前所述,JumpTable 结构编译成功,如果删除 main 函数中的行,则编译代码。但是我不完全确定,您可能是对的,请详细说明您的意见,以便我可以尝试一下,无论如何谢谢@ChrisDodd
  • 此外,所有处理函数都在头文件 jmp_common.h #define JMP_DEF_COM(com) extern void Jmp_Handler_##com(void); #include "jmp_cmd_list.h" #undef JMP_DEF_COM

标签: c unresolved-external jump-table


【解决方案1】:

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

感谢@chris 和@colonel 的回复。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2012-04-13
    • 2019-05-02
    相关资源
    最近更新 更多