为什么C++成员函数不能作为C-Style回调函数?

【C/C++】Google 出品的代码规范(Google C++ Style Guide) 翻译整理自 Google C++ Style Guide Ref Ref Google C++ Style Guide : 官方原版 C++ Coding Style : 不错的表格汇总 Google C++ 风格指南: 很完整的中文翻译 一张图总结Google C++编程规范(Google C++ Style Guide): 非常帮的一张图,可以用于概览,回忆... 阅读详情

1. 为什么C++成员函数不能作为C-Style回调函数?

在C语言中,通过注册函数指针的方式,来实现函数回调。如下是一个的例子。

 

 

 

 

但是如果将类的成员函数作为回调的函数指针传进去。结果是不成功的。

如下所示:

 

 

 

VC2008编译错误如下:

 

 

为什么呢?

从VC编译错误可以简单看出,成员函数地址与期望的函数指针类型不匹配。

普通类成员函数的修饰符是 __thiscall, 而C/C++全局函数的默认修饰符是 __cdecl。

 

更进一步来说:

普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。

 

 

 

 

 

C++问题八:C-style与string的区别与联系。分别利用这两种方式实现同样的操作。 C++问题八:C-style与string的区别与联系。分别利用这两种方式实现同样的操作。 区别: C-style :是C语言风格字符串,它是一个指针或者是一个char数组,字符串的末尾有\0字符。 string:C++标准库定义了string类,头文件为#include。该文件下提供了大量的字符串操作函数并且可以与C-style相转换。string本质上是以字符作为元素的vector(容器)的特化版本。不存在0字符结尾这个概念。 通过c_str()或data()把string转化为c-style时,结尾会 阅读详情

相关推荐

将类成员函数用做C回调函数

系统讲述了如何来使用回调函数,通过本教程你可以迅速掌握如何使用回调函数

把C++类成员方法直接作为线程回调函数

我以前写线程时要么老老实实照着声明写,要么使用C++类的静态成员函数来作为回调函数,经常会因为线程代码而破坏封装.之前虽然知道类成员函数的展开形式,但从没想过利用过它,昨天看深入ATL时无意中学会了这一招:) 类成员方法是一个比较特殊的函数,它在编译时会被转化成普通函数,比如有TMyClass类:class TMyClass{    void Func();};这个TMyClass::Fu

C++Builder加油站 6122

c++类成员函数作为回调函数

c++类成员函数作为回调函数

如何在类中实现回调成员函数

回调函数(Callback   function)大量用于Windows的系统服务,通过它,程序员可以安装设备驱动程序和消息过滤系统,以控制Windows的有效使用。许多程序员都发现,利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根本原因是回调函数是基于C编程的Windows   SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函

zqf5816的专栏 1274

C++将类的成员函数作为回调函数

C++将类的成员函数作为回调函数使用介绍

怎么实现类的成员函数作为回调函数

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用

不能作为c语言常量的是115L,c语言考试选择题

07P11.以下叙述中正确的是CA)C程序中的注释只能出现在程序的开始位置和语句的后面B)C程序书写格式严格,要求一行内只能写一个语句C)C程序书写格式自由,一个语句可以写在多行上D)用C语言编写的程序只能放在一个程序文件中(2008.9)11)以下叙述中正确的是CA)C程序的基本组成单位是语句B)C程序中的每一行只能写一条语句C)简单C语句必须以分号结束D)C语句必须在一行内写完12.计算机能直...

weixin_30306285的博客 1583

Materials Studio与LAMMPS联合作战:如何用msi2lmp.exe完美转换聚合物模型(含PCFF力场配置)

本文详细解析了如何利用msi2lmp.exe工具将Materials Studio中的聚合物模型高效、准确地转换为LAMMPS可识别的data文件,并重点配置PCFF力场。文章提供了从MS模型构建、文件导出到命令行转换、参数调整及转换后验证的全流程实战指南与避坑技巧,旨在帮助研究者解决模型转换中的常见问题,实现跨平台分子动力学模拟的无缝衔接。

weixin_29228781的博客 520

如何使 类的成员函数作为回调函数

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为...

weixin_34364071的博客 594

python-snap7 报错:can‘t find snap7 library. If installed, try running ldconfig

1、使用场景: Python 读取西门子 S7 系列 PLC 信息,会用到 snap7 库,网上也有很多案例。但是,运行时会报错:can't find snap7 library. If installed, try running ldconfig 2、解决方案: A、下载项目需要依赖的 dll、lib 文件: i、Sourceforge下载:https://sourceforge.net/projects/snap7/files/ ii、优快云下载(免费):https://dow.

蜡笔小新历险记的博客 3649

Qwen-Image-2512 本地部署完全指南:从零开始搭建你的AI绘图工作站

阿里通义团队开源了Qwen-Image-2512模型,这款AI绘图模型在人物真实感、自然细节和文字渲染上表现惊艳,甚至在盲测中超越部分闭源模型。本文提供了详细的本地部署教程,从硬件准备、环境安装到使用ComfyUI运行模型,手把手教你生成第一张AI图片,并分享了进阶技巧和免费在线体验方式。

莫潇羽的个人博客 2426

将C++builder中的类成员函数当作windows回调函数

VCL的成员函数通常情况下,不能作为winodws的回函数,因为成员函数隐式包含一个this指针参数。回调函数中,最先运行的机器码(windows自动执行)。 //16个字节汇编指令 #pragma pack(push) //保存对齐状态 #pragma pack(1) struct TInstruction { byte Code1[7]; void *Self;

chinayu2007的专栏 846

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

perseverance51博客 2893

C++成员函数指针转C-Style普通函数指针

【代码】C++成员函数指针转C-Style普通函数指针。

fifbro的博客 2421

代谢组数据分析(五):代谢组的功能富集分析

本文介绍了代谢组数据分析中的功能分析,包括代谢物富集分析、GSEA和ssGSEA方法。文章详细阐述了分析原理、应用背景、数据准备、统计方法以及结果解释,强调了在代谢通路和代谢物ID对应关系建立、差异代谢物筛选、富集程度计算等方面的关键步骤。通过这些方法,可以揭示差异代谢物在生物过程中的作用,为疾病研究和药物开发提供依据。

专注生信领域 5981

Vue3 + uniapp 踩坑:iOS 真机调试一直报错Maximum call stack size exceeded,和(in promise)MiniProgramError err的解决方法

不是你写错代码,是微信开发工具和 iOS 真机调试的兼容问题。开个空项目都报错,勾个设置就没问题,不是你,是工具的锅。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1267

c++ 回调函数与std::function使用实例

理解回调 实际项目中,经常有使用回调函数的需求,如: 双方通信中,等待接收对方的数据并处理,如使用socket进行的TCP通信 定时器事件,当定时器计时结束时,需要处理某任务 信号的触发,需要执行某任务 在同步编程中,需要启动一个专门的线程来阻塞监听并处理那些可能在未来发生的事件,而在异步编程中,只需要使用回调函数就可以了。 在这种场景下,可以简单地理解为:我为某事件注册一个处理函数,当该事...

guotianqing的博客 1万+

Unity零基础到入门 ☀️| 基础知识入门篇章,看完就可以做游戏啦! | 寻找C站宝藏

Unity入门基础知识。本篇文章介绍了关于Unity入门的一些基础知识,包括基本概念和使用实例。简单易上手,轻松实现Unity入门操作!

努力前行,总会成为自己心中的那道光 1万+

C-Style类型转换引发的问题

转载自[url]http://jackaldire.com/201001/c-style-cast-issues/[/url] 有人在byr论坛C++版上问了这样一道C++面试题: [code="cpp"] #include using namespace std; class A { public: void fun() { } }; cla...

wyjvip333的专栏 544

借助AI搞定国社科“研究内容”部分!用Gemini 3 Pro轻松撰写6大模块,让基金本子效率质量更上一层楼

所谓研究整体框架,是对课题研究逻辑结构与技术路径的系统阐述,其核心在于通过研究目标分解、研究内容模块化与研究方法整合,构建一个层次清晰、逻辑严密、科学可行的研究体系。撰写要求:1)分要点、分层次列出主要研究内容,保持各部分之间的逻辑性、层次性与系统性;研究可行性可理解为开展本课题在理论基础、研究方法、研究条件、人员结构、平台支撑及外部协作等方面的可实施程度,可从内部条件与外部条件两个维度进行系统论证。研究背景为:我正在申报xxx年xxx(项目名称),课题名称为:xxx,拟采用的主要研究方法包括:xxx等;

智能AI让学术科研更容易 964

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++11 lambda表达式在回调函数中的使用

C++11的lambda表达式在回调函数使用时的特性

BlowfishKing的博客 3006

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++如何在C-style注册回调函数参数中使用lambda表达式,C风格的回调函数传递lambda表达式 作为参数

C++如何在C-style注册回调函数参数中使用lambda表达式,C风格的回调函数传递lambda表达式 作为参数

白袍小将的博客 695

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

GE Eager Style Graph Builder C++ API文档

Eager Style Graph Builder 是 GraphEngine 中用于构建计算图的函数式接口模块,提供了便捷的图构建功能。该模块对外头文件位于 `inc/external/ge/eager_style_graph_builder/` 目录下。 ## 目录结构 ``` inc/external/ge/eager_style_graph_builder/ ├── c/ │ └─

gitblog_00967的博客 625

VSCode一步更改C/C++格式化方式

VSCode一步更改C/C++格式化方式 VSCode默认的格式化方式是下面这样: #include <cstdio> using namespace std; const int maxn = 1005; int a[maxn]; char s[maxn]; bool read(int *a, int &n) { int cnt = 0; if (!gets(...

→↗允↘的博客 1万+
上一篇: 词法分析生成器 之 lexertl 【4】添加文件解析行号功能
下一篇: C++工厂模式实现与改进小结
MPForwd
博客等级 码龄20年 7粉丝 20原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值