禁用"bad function cast"警告
Disabling "bad function cast" warning
我收到以下警告:
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;
您必须将此ptr
与MyClass
的对象一起使用,例如:
MyClass obj;
obj.*ptr('a');
你不能把一个带两个参数的函数传递给一个只带一个参数的函数。做不到的,忘了它吧,就这样。调用者向函数传递一个参数。它不知道第二个参数,它不会把它传递给你的函数,不管你怎么努力,你都不能让它做你想做的。
出于同样的原因,你不能传递一个非静态成员函数,而期望传递一个常规函数。成员函数需要一个对象进行操作。无论调用你的函数的代码是什么,它都不知道这个对象,没有办法把对象传递给它,也没有办法让它使用正确的调用序列来考虑这个对象。
接口接受用户的函数,而不接受用户可能想要传递给他的函数的额外数据,本质上是邪恶的。看看C标准库中的qsort()
函数。这是一个邪恶界面的例子。假设您希望根据外部定义的排序方案对字符串数组进行排序。但是它只接受一个接受两个值的比较函数。如何将该排序模式传递给比较函数?你不能,所以如果你想让它工作,你必须使用一个邪恶的全局变量,所有的字符串都附加在它上面。
这就是c++从传递函数指针转向函数对象的原因。函数对象可以封装你想要的任何数据
还有,这可能很有帮助
union FuncPtr
{
void (* func)(MyClass* ptr, byte);
void (MyClass::* mem_func)(byte);
};
- 警告处理为错误这里有什么问题
- 如何理解C++标准N3337中的expr.const.cast子句8
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- C++Cast运算符过载
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- 禁用"bad function cast"警告