如果我们不知道列表的开头,如何在没有指定参数的函数中初始化 ap ?

发布于 2024-12-20 12:27:41 字数 287 浏览 0 评论 0原文

我需要创建一个函数来创建一组整数。因为我不知道没有。论点,我想到使用省略号。

   void f1(...)
   {
     va_list ap;
       //how to initialize ap as I don't know the last actual argument as there is no such argument!!!
   }

另外,是否有其他方法可以知道列表是否已结束,而不是提供最后一个参数以及表示列表末尾的值???

请帮忙!!!

I need to create a function to create a set of integers. As I don't know the no. of arguments, I thought of using the ellipses.

   void f1(...)
   {
     va_list ap;
       //how to initialize ap as I don't know the last actual argument as there is no such argument!!!
   }

Also, is there any other way to know whether the list has ended instead of supplying a last argument with a value that denotes the end of list????

Please help!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

恋你朝朝暮暮 2024-12-27 12:27:41

这是使用 va_list 的示例 。如果传递一个数组和一个计数而不是 var args,可以获得相同的效果,如下所示:

void f(int[] numbers, int count) {
    // Do stuff
}

int main() {
    int p[] = {1,2,3};
    f(p,sizeof(p)/sizeof(p[0]));
    return 0;
}

Here is an example of using va_list. You can get the same effect if you pass an array and a count instead of var args, like this:

void f(int[] numbers, int count) {
    // Do stuff
}

int main() {
    int p[] = {1,2,3};
    f(p,sizeof(p)/sizeof(p[0]));
    return 0;
}
北音执念 2024-12-27 12:27:41

让我们稍微重写一下你的函数。

Set &f1(int a1, ...)
{
    Set &new_set = new(Set);
    new_set.add(a1);
    va_list args;
    va_start(args, a1);
    int aN;
    while ((aN = va_arg(args, int)) != -1)
        new_set.add(aN);
    va_end(args);
    return new_set;
}

现在,可以通过以下方式调用:

Set s1 = f1(1, -1);
Set s2 = f1(1, 2, -1);
Set s3 = f1(1, 2, 3, -1);

但请注意,每个调用站点的参数数量都是已知的。另一种接口设计指定第一个参数中的参数数量:

Set s1 = f1(1, 1);
Set s2 = f1(2, 1, 2);
Set s3 = f1(3, 1, 2, 3);

但是,如果您需要在一次调用中指定任意数量的参数,那么您需要一个更像这样的接口:

Set &f1(size_t num, const int *array);

这允许您指定第一个参数中的项目数量大批。

Let's rewrite your function a little.

Set &f1(int a1, ...)
{
    Set &new_set = new(Set);
    new_set.add(a1);
    va_list args;
    va_start(args, a1);
    int aN;
    while ((aN = va_arg(args, int)) != -1)
        new_set.add(aN);
    va_end(args);
    return new_set;
}

Now, this can be invoked with:

Set s1 = f1(1, -1);
Set s2 = f1(1, 2, -1);
Set s3 = f1(1, 2, 3, -1);

Note, though, that the number of arguments is known at each call site. An alternative interface design specifies the number of parameters in the first argument:

Set s1 = f1(1, 1);
Set s2 = f1(2, 1, 2);
Set s3 = f1(3, 1, 2, 3);

However, if you need to specify an arbitrary number of arguments in a single call, then you need an interface more like:

Set &f1(size_t num, const int *array);

This allows you to specify the number of items in the array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文