为什么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

使用单片机和电流互感器对非正弦周期电流有效值测定

使用单片机和电流互感器,利用一种高速采样的方法来进行有效值测定

月光绿叶滴水音乐 3945

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

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

weixin_34364071的博客 594

VerilogEval实战指南:从基准测试到模型微调的全流程解析

本文提供了VerilogEval实战指南,详细解析了从基准测试到模型微调的全流程。VerilogEval是一个自动化、标准化的测试框架,用于客观评估大语言模型生成Verilog硬件代码的能力。文章涵盖了环境搭建、核心机制解析、利用其生成合成数据进行模型微调的策略,以及如何将其工程化集成到自动化评估流程中,为硬件设计领域的AI应用提供了完整的方法论。

yy01234的博客 1005

Flash芯片的VCC上电到可操作时间过长

Flash的VCC上电到操作时间(tVSL)通常有最大值限制,如果超过这个时间,核心风险是状态机不同步和指令锁存错误。比如芯片内部振荡器可能已经尝试启动又休眠了,但主控却在这之后才发送指令,导致完全 misinterpreted。Flash芯片的(从电源上电到可以正常进行读写操作的时间)如果过长,会产生一系列负面影响简单来说,这个时间过长意味着电源上升速度太慢,违反了芯片的要求。

qq_61918649的博客 722

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

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

chinayu2007的专栏 846

FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析

FPGA学习之路——原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异。原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作。而原码二位乘则是对乘数的低二位进行判断,并执行相关操作。 两位乘数的取值可以有四种可能组合,每种组合对应于以下操作: 00相当于0x,部分积Dresult右移2位,不进行其他运算; 01相当于1x,部分积D...

谦豫 3716

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

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

fifbro的博客 2421

Python爬虫技术:使用Playwright和Twitter API v2高效获取Twitter/X数据完全教程

遵守规则:始终遵循Twitter的使用条款和速率限制错误处理:实现完善的错误处理和重试机制数据质量:进行数据清洗和验证性能优化:使用异步处理和合理的延迟设置可维护性:模块化代码,便于维护和扩展。

2201_76125261的博客 671

大数据Alluxio面试题及参考答案

Alluxio 在大数据生态里的定位是作为数据编排层,能在不同计算框架和存储系统之间起到桥梁的作用。它的核心功能在于加速数据访问,让大数据应用能够更高效地使用数据。Alluxio 把数据存储和数据处理分离开来,使计算框架可以在不考虑底层存储细节的情况下访问数据,这样就提高了系统的灵活性和可扩展性。Alluxio 和 HDFS 既存在关联又有区别。从关联方面来看,HDFS 是一种广泛使用的分布式文件系统,很多大数据应用都将其作为主要的数据存储系统。Alluxio 可以和 HDFS 集成,把 HDFS 当作底层

大模型大数据攻城狮的专栏 862

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

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

guotianqing的博客 1万+

【知识分享】IBIS 建模指南 03

本文介绍了差分缓冲器的数据提取方法,重点分析了差分系统与单端系统的核心差异。文章详细阐述了差分接收机和驱动器的结构特点、工作原理及建模方法,指出全差分结构具有优异的电源噪声抑制能力。针对IBIS建模规范,作者提出了三维I-V曲面数据提取技术,并介绍了共模/差模电流分离、片上端接处理以及V-T表生成的解决方案。文章还探讨了差分电容(C_diff)的测量方法和数据简化策略,为复杂差分缓冲器的精确建模提供了系统化的技术路径。

一只豌豆象的博客 1282

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

BlowfishKing的博客 3006

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

白袍小将的博客 695

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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、付费专栏及课程。

余额充值