【问题标题】:C - Pass variable number of command line arguments into method with variable number of parametersC - 将可变数量的命令行参数传递给具有可变数量参数的方法
【发布时间】:2013-01-29 20:20:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c command-line-arguments variadic-functions


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我在my postscript interpreter 中做过类似的事情。

      这是来自我的操作员处理函数。它使用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 interpreter (AKA Rutherford interpreter, AKA RALpage)借用了这个技术。

      【讨论】:

      • 你们这些家伙,但那太可怕了。要规范,并要求 FindFiles 是 variadac,这使得它比我的建议更好地响应规范,但是糟糕!
      • 我的程序有很大的回报。运算符函数本身不是可变的,并且具有有意义的参数名称。在以前的版本中,每个操作函数都直接操作堆栈(很多 tos[-1]、tos[-3])。
      猜你喜欢
      • 2014-12-04
      • 2013-09-21
      • 2015-09-23
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多