3

我正在编写一个 C 程序,它将采用可变数量的命令行参数。然后我需要获取这些参数并将它们传递给一个函数,该函数将可变数量的文件名作为单独的参数(使用 va_arg 获取函数内部的参数),原型为:

void FindFile(char *filename1, ...);

我对 FindFile 的实现很好。我的问题是,如何在 main 方法的 'char *argv[]' 中获取可变数量的参数,并在调用 FindFile 时将它们用作参数?

这是一个类的赋值,所以 FindFile 原型不能改变。我一直在寻找使这项工作的方法,只找到一个答案,说这是不可能的。真的是这样吗?这是我的教授给出的确切规范,所以我认为它可能会以某种方式实现,但确切的方法并没有在课堂上讨论。

4

2 回答 2

2

我在我的 postscript 解释器中做了类似的事情。

这是来自我的操作员处理程序功能。它使用 switch 语句通过函数指针进行可变参数调用。

call: /* pass args bottom-up */
    tos = siq; /* pop the stack to the 'stack in question' */
    /* room for output? */
    if (tos-os + op.sig[i].out > OSSIZE) error(st,stackoverflow);
    switch (op.sig[i].n) {
        case 0: op.sig[i].fp(st); break;
        case 1: op.sig[i].fp(st, siq[0]); break;
        case 2: op.sig[i].fp(st, siq[0], siq[1]); break;
        case 3: op.sig[i].fp(st, siq[0], siq[1], siq[2]); break;
        case 4: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3]); break;
        case 5: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4]); break;
        case 6: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4], siq[5]); break;
        default: error(st,unregistered);
    }

我从Goswell 解释器(AKA Rutherford 解释器,AKA RALpage)那里借用了这种技术。

于 2013-02-14T05:21:12.283 回答
2

不可能的事情(至少在 K&R、ansi-c 和 c99 中以及除非实现依赖技巧)是在运行时将选定的命令行参数附加到某种参数列表并将其传递给您的函数。太糟糕了,因为这是首先想到的。

这使您的问题之一是弄清楚您可以做什么。FindFile(fname, argc, argv);例如,您可以每次调用(给定的 varidac 函数) 。编写这样的代码而不是仅仅给出FindFile一个固定的签名会很愚蠢(真的,非常,非常愚蠢),但是FindFile可以编写给定的可变参数版本来管理它就好了。

如果您只想传递一些命令行参数,您将创建一个char*[]只包含您想要的参数并将其传递的新参数。

于 2013-02-14T04:51:44.617 回答