错误使用void表达式无效
我有一个函数int rt_task_start (RT_TASK *task, void(*task_func)(void *arg), void *arg)
其中在第二个参数中我传递一个带参数的函数。
- 当我当时只传递一个函数名时没有问题。(正如预期的那样,它正在工作)。
rt_task_start(&demo_task1, demo, 1);
- 但是当我传递
rt_task_start(&demo_task1, demo(&val), 1);
它给了我错误error: invalid use of void expression
。 之前定义了变量val。int val = 0;
- 当我用这个
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
。 -
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;