繁体   English   中英

带参数的Void *函数

[英]Void* function with a parameter

对于我要编写的应用程序,我需要能够在interface编写GLEnable(GL_REPEAT) (完成此工作)。 用户这样做后,系统应使用正确的参数调用该函数。

为此,我使用以下变量来获取正确的功能:

std::map<std::string, void(*)(GLenum)> glEnableDisable;

并通过以下方式在其中存储数据:

glEnableDisable["glEnable"]  = glEnable;
glEnableDisable["glDisable"] = glDisable;

(请注意,上面给出了警告“'='无法从'void(__stdcall *)(GLenum)'转换为'void(__cdecl *)(GLenum)'”)

最后,该函数通过以下方式调用:

((void (*)(GLenum)) Main.glEnableDisable[SplittedUp[0]])(Parameter);

现在,我想知道我在做什么错。 我没有参数就可以正常工作,但是我确实需要参数。

提前致谢,

乔伊

更改此:

std::map<std::string, void(*)(GLenum)> glEnableDisable;

对此:

std::map<std::string, std::function<void(GLenum)>> glEnableDisable;

不必担心再次调用约定。 std::function能够存储任何函数或可调用对象,无论其调用约定是什么。

不需要强制转换:

Main.glEnableDisable[SplittedUp[0]])(Parameter);

问题是“如何在std::map<std::string, void(*)(GLenum)>一个接受参数的函数指针”? 如果是,则答案是:不可能,因为您声明了具有固定功能指针签名的映射。 代码中的签名表示存储的函数指针不接受任何参数。

如果要存储参数,则有两个选择:

  1. 包装函数,该函数访问不在堆栈上的参数,并使用提供的参数调用指定的函数。

  2. 为您使用的每个函数指针签名创建一个映射。

提示:幸运的是您的程序没有由于错误的调用约定而崩溃。 建议将调用约定调整为__cdecl

明显:

void(*)(GLenum)

不是 GLenum函数的正确原型。

假定C调用约定,在Visual Studio中默认为__cdecl 但是,您要调用的实际函数使用不同的调用约定,即__stdcall

这样的事情应该可以解决这个问题:

typedef void (__stdcall *GLenumFunc)(int, int); // or whatever your params are
//...
std::map<std::string, GLenumFunc> glEnableDisable;

关于什么是调用约定: x86平台上的调用约定

暂无
暂无

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

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