Error Invalid use of void expression

后端 未结 3 1264
夕颜
夕颜 2021-01-02 01:54

I have a function int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg) where in second argument i am passing a function with argument.

相关标签:
3条回答
  • 2021-01-02 02:01

    I'm not sure how the code in (1) can possibly compile. But here is what you should be using:

    int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg);
    int val = 1;
    rt_task_start(&demo_task1, demo, &val);
    

    You cannot pass the function pointer bound to a specific argument, that is something like a closure, which isn't available in C. You can, however, pass the function pointer and then separately pass the argument you want to apply (which is what the function signature suggests you should do). But you must pass that argument as a pointer, not a literal.

    0 讨论(0)
  • 2021-01-02 02:08

    Surely you want:

      int i=1;
      rt_task_start(&demo_task1, demo, (void*) &i);
    

    Just by matching the argument types, remember the second argument is just a function pointer, not a function call with its own argument, it's own argument is only used when you call it within rt_task_demo. If you then want to use the value '1' in function 'rt_task_demo' you would recast it like

    int ii = *(int*) arg;
    
    0 讨论(0)
  • 2021-01-02 02:17
    void (*task_func)(void *arg);
    

    The above statement defines task_func to be a pointer to a function which takes a pointer of type void * and returns no value.

    Therefore, when you call your function rt_task_start, you should pass a pointer to a function as the second argument. Also, you should pass a pointer of type void * as the third argument, not an integer. A function name evaluates to a pointer to the function, so you can simply pass the function name as the argument value, or you can use the address-of operator & before the function name.

    int arg = 4;
    
    // both calls are equivalent
    
    rt_task_start(&demo_task1, demo, &arg);
    rt_task_start(&demo_task1, &demo, &arg);
    
    0 讨论(0)
提交回复
热议问题