Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disabling "bad function cast" warning

I'm receiving the following warning:

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

This is because I need to pass as argument a member function instead of an ordinary function. But the program is running correctly.

I'd like to disable this warning (Wno-bad-function-cast doesn't work for C++) or to implement a different way to pass a member function.

like image 307
funkadelic Avatar asked Jul 13 '11 09:07

funkadelic


1 Answers

No. Take this warning seriously. You should rather change your code to handle this scenario.

Pointer to member function(void (MyClass::*)(byte)) and normal function pointer (void (*)(byte)) are entirely different. See this link. You cannot cast them just like that. It results in undefined behavior or crash.

See here, how they are different:

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

Now you may feel that, foo(byte) and MyClass::foo(byte) have same signature, then why their function pointers are NOT same. It's because, MyClass::foo(byte) is internally resolved somewhat as,

void foo(MyClass* const this, byte);

Now you can smell the difference between them.

Declare pointer to member function as,

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

You have to use this ptr with the object of MyClass, such as:

MyClass obj;
obj.*ptr('a');
like image 93
iammilind Avatar answered Sep 27 '22 23:09

iammilind