【问题标题】:Error Invalid use of void expression错误无效表达式的使用
【发布时间】:2014-05-09 01:07:24
【问题描述】:

我有一个函数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); 打电话时,这显示错误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 指针。它给了我错误。请有任何想法!

【问题讨论】:

  • 你对这个功能的意图是什么?您希望第二个参数是函数指针还是不同的数据类型?不能同时是两者。此外,int *val; *val = 0; 可能会产生分段错误,因为您将值分配给未定义的地址位置。
  • @mbratch thanx 指出我,我想要第二个函数只是一个函数指针。实际上我对第二个参数void(*task_func)(void *arg) 它可以采用什么类型的参数感到困惑。我虽然我也可以发送参数,但对于完全不正确的案例 2、3、4。

标签: c xenomai


【解决方案1】:
void (*task_func)(void *arg);

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

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

int arg = 4;

// both calls are equivalent

rt_task_start(&demo_task1, demo, &arg);
rt_task_start(&demo_task1, &demo, &arg);

【讨论】:

    【解决方案2】:

    我不确定 (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 中不可用。但是,您可以传递函数指针,然后单独传递要应用的参数 (这是函数签名建议你应该做的)。但是您必须将该参数作为指针而不是文字传递。

    【讨论】:

      【解决方案3】:

      你当然想要:

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

      仅仅通过匹配参数类型,记住第二个参数只是一个函数指针,而不是一个有自己参数的函数调用,它自己的参数只有在你在 rt_task_demo 中调用它时才会使用。如果你想在函数 'rt_task_demo' 中使用值 '1',你可以像这样重铸它

      int ii = *(int*) arg;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多