禁用"bad function cast"警告

Disabling "bad function cast" warning

本文关键字:警告 cast bad 禁用 function      更新时间:2023-10-16

我收到以下警告:

warning: converting from 'void (MyClass::*)(byte)' to 'void (*)(byte)'

这是因为我需要传递成员函数而不是普通函数作为参数。但是程序运行正常。

我想禁用此警告(Wno-bad-function-cast对c++不起作用)或实现另一种传递成员函数的方式。

。认真对待这个警告。你应该修改你的代码来处理这种情况。

指向成员函数的指针(void (MyClass::*)(byte))和普通函数指针(void (*)(byte))是完全不同的。请看这个链接。你不能像那样使用它们。它会导致未定义的行为或崩溃。

看这里,它们的不同之处:

void foo (byte); // normal function
struct MyClass {
  void foo (byte); // member function 
}

现在你可能会觉得,foo(byte)MyClass::foo(byte)具有相同的签名,那么为什么它们的函数指针不相同呢?这是因为,MyClass::foo(byte)内部解析有点像

void foo(MyClass* const this, byte);

现在你可以闻到它们之间的区别了。

声明指向成员函数的指针为,

void (MyClass::*ptr)(byte) = &MyClass::foo;

您必须将此ptrMyClass的对象一起使用,例如:

MyClass obj;
obj.*ptr('a');

你不能把一个带两个参数的函数传递给一个只带一个参数的函数。做不到的,忘了它吧,就这样。调用者向函数传递一个参数。它不知道第二个参数,它不会把它传递给你的函数,不管你怎么努力,你都不能让它做你想做的。

出于同样的原因,你不能传递一个非静态成员函数,而期望传递一个常规函数。成员函数需要一个对象进行操作。无论调用你的函数的代码是什么,它都不知道这个对象,没有办法把对象传递给它,也没有办法让它使用正确的调用序列来考虑这个对象。

接口接受用户的函数,而不接受用户可能想要传递给他的函数的额外数据,本质上是邪恶的。看看C标准库中的qsort()函数。这是一个邪恶界面的例子。假设您希望根据外部定义的排序方案对字符串数组进行排序。但是它只接受一个接受两个值的比较函数。如何将该排序模式传递给比较函数?你不能,所以如果你想让它工作,你必须使用一个邪恶的全局变量,所有的字符串都附加在它上面。

这就是c++从传递函数指针转向函数对象的原因。函数对象可以封装你想要的任何数据

还有,这可能很有帮助

union FuncPtr    
{
  void (* func)(MyClass* ptr, byte);
  void (MyClass::* mem_func)(byte);
};