繁体   English   中英

如何将函数分配给函数指针?

[英]How to assign functions to a function pointer?

我正在编写一个 Gameboy 模拟器,对于 CPU 的指令,我在这里(在 cpp.hpp 中)使用这个结构来存储有关它们的信息。 该映射用于通过等于其个人操作码的密钥访问所有这些信息:

    struct instruction {
        std::string name;    //name of the instruction
        int cycles;          //clock cycles required to be executed
        int paramNum;        //number of params accepted
        void* function;      //code to be executed
    };
    class Cpu {
        private:
            std::map<unsigned char, instruction> instrMap;
            void Cpu::fillInstructions(void);
            instruction addInstruction(std::string, int, int, void*);
        public:
            void add_A_n(unsigned char);
    }

然后在 cpu.cpp 中,例如我想转换为函数指针的函数之一,以便分配给结构指令的字段。 所以我有这个代码:

    void Cpu::add_A_n(unsigned char n) {
        //body     
    }
    void Cpu::addInstructions(std::string name, int cycles, int paramNum, void* function) {
        instruction i = {name, cycles, paramNum, function};
        return i;
    }
    void Cpu::fillInstructions() {
        instrMap[0x80] = Cpu::addInstruction("ADD A, n", 4, 0, (void*)&Cpu::add_A_n);
    }

目标是从内存中获取操作码,然后使用该操作码从映射中检索有关相关指令的信息,最后通过使用 switch case 选择正确的来执行其功能:

    ((void (*)(void))instrMap[0x80].function)(); //for 0 params
    ((void (*)(unsigned char))instrMap[0x90].function)((unsigned char)operand); //for 1 param

我的目标是将所有函数,甚至是那些需要一些参数的函数,转换为结构体中的函数。

它正确执行了相应的功能,但会引发警告:

警告:从“void (Cpu:: )()”转换为“void ”[-Wpmf-conversions] instrMap[0x80] = Cpu::addInstruction("ADD A, n", 4, 0, (void*)&Cpu ::add_A_n);

我该如何解决它以及它为什么会发生? 谢谢

&Cpu::add_A_n返回一个指向成员函数指针,这与普通的函数指针有很大的不同,两者不能混用。 指向成员函数的指针的奇怪之处在于,非静态成员函数都需要一个this实例才能调用该函数。

在您的情况下,如果像add_A_n这样的函数真的不依赖于this ,只需将其add_A_n static或非成员函数:

class Cpu {
    ...
    static add_A_n(unsigned char);
};

这样,就不再需要调用this了, &Cpu::add_A_n就变成了普通的函数指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM