66

I try to call a function which passed as function pointer with no argument, but I can't make it work.

void *disconnectFunc;

void D::setDisconnectFunc(void (*func)){
    disconnectFunc = func;
}

void D::disconnected(){
    *disconnectFunc;
    connected = false;
}
2
  • 7
    cdecl.org can help. Commented Apr 6, 2010 at 1:45
  • @JRL cdecl doesn't help with that in particular (I tried cdecl before googling this question). Commented Feb 2, 2016 at 15:31

3 Answers 3

98

The correct way to do this is:

typedef void (*callback_function)(void); // type for conciseness

callback_function disconnectFunc; // variable to store function pointer type

void D::setDisconnectFunc(callback_function pFunc)
{
    disconnectFunc = pFunc; // store
}

void D::disconnected()
{
    disconnectFunc(); // call
    connected = false;
}
Sign up to request clarification or add additional context in comments.

6 Comments

+1 for using my preferred syntax of de-referencing a function pointer (prefer disconnectFunc() to (*disconnectFunc)(), even though they're both fine)
Is this portable way or it's not recommended to use for portability?
@JavaRunner: It's perfectly portable.
Fine. Thanks! Do you happen to know what I need to fix in that code if I need to pass function to setDisconnectFunc() with some parameters?
@JavaRunner: You should ask a new question if you need help extending it, the comment section is too constrained. There are many ways to do it, whatever your requirements are.
|
14

Replace void *disconnectFunc; with void (*disconnectFunc)(); to declare function pointer type variable. Or even better use a typedef:

typedef void (*func_t)(); // pointer to function with no args and void return
...
func_t fptr; // variable of pointer to function
...
void D::setDisconnectFunc( func_t func )
{
    fptr = func;
}

void D::disconnected()
{
    fptr();
    connected = false;
}

Comments

8

You need to declare disconnectFunc as a function pointer, not a void pointer. You also need to call it as a function (with parentheses), and no "*" is needed.

1 Comment

Thank you. Final code: void (*disconnectFunc)(); void D::setDisconnectFunc(void (*func)()){ disconnectFunc = func; } void D::disconnected(){ (*disconnectFunc)(); connected = false; }

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.