为什么TaskSpawn使用整数而不是void*?

3
针对vxWorks操作系统,他们提供了一个用于创建任务的系统库:
int taskSpawn
    (
    char *  name,             /* name of new task (stored at pStackBase) */
    int     priority,         /* priority of new task */
    int     options,          /* task option word */
    int     stackSize,        /* size (bytes) of stack needed plus name */
    FUNCPTR entryPt,          /* entry point of new task */
    int     arg1,             /* 1st of 10 req'd task args to pass to func */
    int     arg2,
    int     arg3,
    int     arg4,
    int     arg5,
    int     arg6,
    int     arg7,
    int     arg8,
    int     arg9,
    int     arg10
    )

您可以看到相比于std::thread,这种方式非常有限。
通常情况下,我可以根据入口函数传递相应的参数。
考虑到这是一个C函数,我想知道为什么vxWorks选择将参数1-10作为int而不是void指针。
如果它们是void指针,我就能够传递任何类型,并在进入函数后进行强制类型转换。
如果我想将struct foo的指针传递给taskSpawn中提供的入口函数,它能被转换为整数,然后再转换回适当的指针吗?
基于这个函数的设计,我是否被迫使用全局变量?
1个回答

3

我认为你会发现,在VxWorks上,整数与指针的大小相同,常见做法是在它们之间进行强制转换。因此,如果您想通过TaskSpawn传递指针,可以将其作为(int)ptr传递。

不,这不是可移植的C代码,但在这个平台上使用这个函数时,这似乎是正常做法。


嗯,那听起来像是相当糟糕的代码。没有必要依赖实现细节是不好的风格。如果必须将指针作为整数传递(在某些通用函数中有很好的理由),应该使用intptr_t和它的兄弟uintptr_t。这不仅保证了指针的保存,而且还清楚地说明了“此对象可能保存指针”。 - too honest for this site
@Olaf:这并不相关,因为提问者正在使用无法修改的供应商API。 - John Zwinck
请把我的评论当作一条评论。它与代码的质量和供应商的维护情况有关。(我知道VxWorks)。我没有说代码有问题,虽然我非常清楚该代码在该平台上可以工作。但是有很多类似的代码更具问题性,其他人也可能会读到这些评论。 - too honest for this site
1
还应该记住,这个API已经存在很长时间了,任何修改都有可能在长期使用、经过验证的代码中引起问题(或者至少会出现新的警告等),而这些代码在风险规避和变化缓慢的行业广泛使用。 - mjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接