首页 > 其他分享 >关于函数指针的一些问题小结

关于函数指针的一些问题小结

时间:2023-06-14 18:55:54浏览次数:42  
标签:__ std pair 关于 stdcall 函数指针 小结 sdk

最近接到一个需求,使用 sdk 提供的消息回调,一般我们是继承 sdk 的消息类,然后 sdk 的消息回调(虚函数)会在有消息的时候调用回调指针,从而触发回调

不过因为 sdk 那边又对该消息类二次封装了并提供了一些接口,所以在研究二次封装的方法时,遇到了一些有意思的问题,故记录下

typedef void(__stdcall* fSDKLogCallback)(void* ctx, int32_t severity,
                                         const char* message,
                                         uint32_t message_size);

  

std::pair<void*, fSDKLogCallback> sdk_log_cb_;

在编译时,如果删除 __stdcall 调用约定后,

typedef void* fSDKLogCallback(void* ctx, int32_t severity,
                                         const char* message,
                                         uint32_t message_size);

程序会在 std::pair 处报错

 error C2207: 'std::pair<_Ty1,_Ty2>::second': a member of a class template cannot acquire a function type

这是因为 std::pair 的模板参数要求是可复制构造的类型,而函数类型是不可复制构造的。因此,如果你直接使用没有 __stdcall 的函数指针类型作为 std::pair 的模板参数之一,会导致编译错误。

通过将函数指针类型添加 __stdcall 关键字,你可以将其定义为可复制构造的类型,并在 std::pair 的模板参数中使用它,从而避免编译错误。

补充:

__stdcall 是一种调用约定,它指定了函数调用时参数的传递方式、栈的清理方式以及函数调用的规则。在某些情况下,特别是在 Windows 平台的一些 API 中,函数指针的类型定义可能要求使用 __stdcall 调用约定。

当你定义一个函数指针类型 fSDKLogCallback 时,如果你的实际使用场景要求使用 __stdcall 调用约定,那么你必须在函数指针类型的定义中显式添加 __stdcall 关键字。

 

标签:__,std,pair,关于,stdcall,函数指针,小结,sdk
From: https://www.cnblogs.com/strive-sun/p/17481113.html

相关文章

  • 关于服务器的一些笔记
    //查看端口占用netstat-anp|grep8080//查看占用8080端口的进程:fuser-v-ntcp8080//杀死指定进程kill-s91154//持久化运行jar包nohupjava-jargdcx-web-1.0.0.jar& 内网穿透工具https://dashboard.cpolar.com/login......
  • 关于xfs文件系统-在操作系统中遇到两个uuid一样的-挂载报错-wrong fs type, bad optio
    当操作系统中,出现了两个uuid一样的文件系统(笔者这里是xfs),那么默认就只能挂载成功一个[root@qq-5201351~]#blkid|grepxfs|grep1ea9e784-0692-403c-bed1-bf34a5a86a57/dev/nvme1n1:UUID="1ea9e784-0692-403c-bed1-bf34a5a86a57"BLOCK_SIZE="512"TYPE="xfs"/dev/nvme2......
  • 关于我
    我写博客的初心很简单,一是记录一些软件的配置过程(防止第二次配置的时候又抓瞎);二是记录下一下自己学习过程中的一些心得体会。在高乙超的博客中,我曾经看到一句话,叫"Tolearn,read;Toknow,write;Tomaster,teach"。过去二十年里,在学习的过程中,我一直是作为一个输入方,应付......
  • ESXI自动化管理中关于Ansible工具警告提示处理方法
    近期对服务器软件硬件都进行了升级换代,更新的平台操作系统,紧接发现原来跳板机已无法直接使用,也得升级才能使用,于是把跳板机也进行系统升级,重新安装部署自动化运维管理工具,在安装使用ansible对接ESXI服务器管理的时候提示[WARNING]:Nopythoninterpretersfoundforhostx.x.x.x......
  • 关于磁盘与分区-创建xfs文件系统时指定UUID的方法
    关于在linux系统中对于xfs文件系统创建后,可以通过指定文件系统uuid的方式进行挂载[root@qq-5201351~]#mount-U5a85ee6b-2866-4832-8fea-475d7c8b561c/data01[root@qq-5201351~]#mount-txfs-U5a85ee6b-2866-4832-8fea-475d7c8b561c/data02[root@qq-5201351~]#mou......
  • 关于VBA的双引号的使用解疑
    Q:Range("A"&Num)的"A"&Num不就是个范围吗,所以不应该是Range(""A"&Num")吗?A:在VBA中,当您要引用一个范围时,需要使用双引号将其括起来。双引号是告诉VBA,括号内的内容是一个字符串,不需要计算或解释;即使括号内只有一个字母,也必须使用双引号将其括起来。而在你的疑问中,"A"&Nu......
  • 关于本博客
    亲爱的读者,你好:这里主要存放一些我平时个人的感悟和摘抄,一般都是随手之举,cnblog是当前国内生态下唯一将文章权利牢牢给个人的权利,所以我一般只会在这里同步放一些博客的内容,CSDN只用来做图床备份,如果想看最新的博客,请访问https://www.0error.net此致......
  • 谈论关于Redis产生的分布式ID获取为空问题
    一:事故在项目测试中,遇到一个事件创建失败问题,追踪日志发现分布式ID的获取值为空,导致后续表写入异常。经排查锁定相关方法,具体方法经简化如下:@TransactionalpublicStringtestRedisTrans(){redisTemplate.setEnableTransactionSupport(t......
  • 关于导出图片的事宜
    1.数据库存的图片路径,表格导出的时候,需要展示成图片2.需要将图片路径转化为字节码3.先获取图片路径4.转为字节码5.接收的传参格式‘:@JsonProperty("product_back_url")privateStringproductBackUrl;@Excel(name="商品背面",width=15,height=35,type=2,imageTyp......
  • 2023年6月13日,Collections集合工具类,Properties配置文件类,集合使用小结
    1.Properties配置文件类创建配置文件,DBConfig.properties在src目录下username=rootpassword=123456创建test01类packagecom.wz.properties_class;importjava.io.IOException;importjava.util.Properties;publicclasstest01{/***知识点:配置文件类propertie......