C++中为何仅静态成员函数可作为API方法的函数参数传入?
问题原因
这个现象本质是C++静态/非静态类成员函数的底层调用规则差异,和API的参数签名要求共同导致的:
- 非静态成员函数自带隐含参数,签名不匹配
类的非静态成员函数是和具体类实例绑定的,编译器在编译时会自动为这类函数添加一个隐含的首参数:指向当前实例的this指针。也就是说你代码里声明的非静态testFunc,表面写的是void testFunc(ApiDataType adt, void* ptr),实际编译后的真实函数签名等价于void testFunc(MyClass* const this, ApiDataType adt, void* ptr),比API要求的回调函数多了一个参数。而specialApiMethod要求第一个参数传入的ApiInterface*是固定签名的函数指针,和带隐含this参数的非静态成员函数类型完全不匹配,强行传入要么编译直接报错,要么运行时参数错位导致崩溃。 - 静态成员函数无隐含参数,签名完全匹配
被static修饰的类成员函数不属于任何具体的类实例,不存在隐含的this参数,编译后的函数签名和你代码里显式声明的完全一致,刚好符合ApiInterface对应的回调函数类型要求,所以可以正常传入作为回调。
你代码里给第二个参数传入
this是对接这类C风格回调的标准写法:由于静态成员函数不能直接访问类的非静态成员,你把当前实例指针作为自定义上下文参数传给API,后续API触发回调时,会把这个指针原封不动传回testFunc的ptr形参,你在函数内部把ptr强转为MyClass*类型,就能通过这个指针正常操作当前实例的所有成员。
内容的提问来源于stack exchange,提问作者taathy
相关产品推荐
相关产品推荐

