【问题标题】:How to send a lot of variables to a generic function?如何将大量变量发送到泛型函数?
【发布时间】:2012-09-02 15:01:52
【问题描述】:

我有一个函数f,定义如下:

struct s {
    void *data;
    struct s *next;
};

void
f(struct s **p, void *q)
{
    /* ... */
}

void *
g(struct s **p)
{
    /* ... */
}

我必须使用许多不同的参数来测试这些函数。但是指向void 的指针只能包含一个对象地址,对吧?那么如何在不使用临时变量(或者可能在宏中)的情况下自动执行以下操作。

f(p, 2);
f(p, 'c');
f(p, 3.14);

【问题讨论】:

    标签: c unit-testing void-pointers


    【解决方案1】:

    临时变量是没有办法的(嗯,你可以使用静态变量,它肯定不是临时的!)因为你需要一个地址,因此你需要一个(非注册)变量。

    但是,这并不意味着您需要额外的代码行:您可以使用类型初始化器(从 C99 开始):

    f(p, &(int){2});
    f(p, &(double){3.14});
    

    但是,该函数(正如您定义的那样)无法知道您刚刚传递给它的对象有多大,并且它不能只存储指针值,因为它是一个指针到一个非常临时变量。

    (整数可以转换为指针并再次返回,但有一些限制,但您必须检查您的实现以了解详细信息。)

    【讨论】:

    • 谢谢,我想我会使用这个解决方案。
    【解决方案2】:

    创建一个测试变量数组并创建一个 for 循环来调用它。这样你就可以直接发送地址,也许这样的东西应该可以工作:

    for (int i = 0; i < NumOfTestCases; i++)
    {
        f(p, &pArrOfTestCases[i]);
    }
    

    希望对你有帮助。

    【讨论】:

    • 这是一个解决方案,但我不能在数组中使用不同类型的变量,不是吗?无论如何,谢谢。
    【解决方案3】:

    您可以查看此线程示例,它以类似的方式接受参数:

    _beginthread( Bounce, 0, (void *) (structure_of_whatever_variables)  );
                                ^
                                |
                                |
                           This is the parameter of function Bounce
    

    This is source of above example.

    【讨论】:

    • 这是标准方式吗?如果存在,为什么inptr_t 类型存在?
    • 也许是关于命名问题以便于理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多