为什么比较成员函数指针为NULL会产生警告?
Why does comparing a member function pointer to NULL generate a warning?
以下代码在Windows, Mac和iOS上编译时没有警告:
class MyClass {
SomeOtherClass * m_object;
void (SomeOtherClass::*m_callback)();
public:
MyClass(SomeOtherClass * _object,void (SomeOtherClass::*_callback)()=NULL) :
m_object(_object),m_callback(_callback) {}
void DoStuff() {
//generates warning: NULL used in arithmetic when compiling with the Android NDK
if (NULL==m_callback) {
m_object->DoNormalCallback();
} else {
(m_object->*m_callback)();
}
}
};
为什么会产生这个警告,我能做些什么?
如果NULL
被定义为((void*)0)
,您可能会得到一个警告。对象指针与函数指针的类型不兼容。使用普通的0
代替NULL
。0
是一个空指针常量,与函数指针和对象指针类型兼容。
EDIT对不起,我没有注意。这里有一个成员函数指针,而不仅仅是函数指针。与((void*)0)
比较也是违反规则的,许多编译器会发出错误,而不仅仅是警告。
EDIT 2致所有注释的人:我知道一个符合标准的c++编译器不会将NULL定义为((void*)0)
。问题是存在不兼容的编译器和损坏的第三方库(我都见过)。
我不认为你可以比较0
(或NULL
)与成员函数指针,特别是因为它们可能不是真正的指针(当函数是virtual
时,例如)。
就我个人而言,我会重写if
测试而不进行比较,例如:
void DoStuff() {
if (m_callback) {
(m_object->*m_callback)();
} else {
m_object->DoNormalCallback();
}
}
并且,为了加分,在构造函数中执行此测试。
class MyClass {
SomeOtherClass * m_object;
void (SomeOtherClass::*m_callback)();
public:
MyClass(SomeOtherClass * _object,void (SomeOtherClass::*_callback)()=NULL) :
m_object(_object),m_callback(_callback)
{
// Use "DoNormalCallback" unless some other method is requested.
if (!m_callback) {
m_callback = &SomeOtherClass::DoNormalCallback;
}
}
void DoStuff() {
(m_object->*m_callback)();
}
};
尝试使用-Wno-conversion-null
关闭警告。
if (m_callback)
是andr
if (static_cast<void (SomeOtherClass::*)()>(NULL)==m_callback)
m_object->DoNormalCallback();
} else {
(m_object->*m_callback)();
}
仍然不确定为什么GCC的NDK版本需要强制转换。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 如何修复警告"the compiler can assume that the address of 'object' will never be NULL"
- 而 (p=strtok(NULL, "," )) 警告:p可识别的错误分配
- 将 NULL 作为对象返回时未收到任何警告
- ORA-24347:聚合函数中出现NULL列的警告
- 如何修复"reference cannot be bound to dereferenced null pointer"警告
- 警告:将 NULL 传递给 'std::thread::thread
- srand(time(null))导致编译器警告:隐式转换会丢失整数精度
- 为什么在对随机数生成器进行时间种子设定时会收到可能丢失数据的警告(NULL)
- 为什么比较成员函数指针为NULL会产生警告?