错误使用void表达式无效

我有一个函数int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg)其中在第二个参数中我传递一个带参数的函数。

  1. 当我当时只传递一个函数名时没有问题。(正如预期的那样,它正在工作)。 rt_task_start(&demo_task1, demo, 1);
  2. 但是当我传递rt_task_start(&demo_task1, demo(&val), 1); 它给了我错误error: invalid use of void expression 。 之前定义了变量val。 int val = 0;
  3. 当我用这个rt_task_start(&demo_task1, demo(val), 1);调用时rt_task_start(&demo_task1, demo(val), 1); 这显示错误Warning passing argument 1 of 'demo' makes pointer from integer without a cast然后error: invalid use of void expression
  4. int *val; *val = 0; rt_task_start(&demo_task1, demo(&val), 1); 这也给了我错误。

作为一个无效指针,我无法理解我应该传递什么。 它给了我错误。 请任何想法!

 void (*task_func)(void *arg); 

上面的语句将task_func定义为一个指向函数的指针,该函数接受void *类型的指针并且不返回任何值。

因此,当您调用函数rt_task_start ,应该将指向函数的指针作为第二个参数传递。 此外,您应该传递类型为void *的指针作为第三个参数,而不是整数。 函数名称求值为指向函数的指针,因此您可以简单地将函数名称作为参数值传递,或者可以使用address-of运算符&函数名称之前。

 int arg = 4; // both calls are equivalent rt_task_start(&demo_task1, demo, &arg); rt_task_start(&demo_task1, &demo, &arg); 

我不确定(1)中的代码是如何编译的。 但这是你应该使用的:

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

你不能传递绑定到特定参数的函数指针,这类似于闭包,它在C中不可用。但是,你可以传递函数指针,然后单独传递你想要应用的参数(这是什么函数签名建议你应该这样做)。 但是你必须将该参数作为指针传递,而不是文字。

当然你想要:

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

只需匹配参数类型,记住第二个参数只是一个函数指针,而不是带有自己参数的函数调用,只有在rt_task_demo中调用它时才会使用它自己的参数。 如果你想在函数’rt_task_demo’中使用值’1’,你可以重新设置它

 int ii = *(int*) arg;