2013-02-14 90 views
3

我正在编写一个C程序,它将采用可变数量的命令行参数。我需要再考虑这些参数和(使用的va_arg得到函数内部的参数)将它们传递到采用可变数量的文件名作为单个参数的函数,原型为:C - 将可变数量的命令行参数传递给具有可变数量参数的方法

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

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

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

回答

2

它是什么可以做到(至少以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)这个技巧。

+0

你好,但这太可怕了。为了规范,并且要求'FindFiles'是variadac,这使得它对规范的反应比我的建议更好,但是糟糕! – dmckee 2013-02-14 14:12:45

+0

我的计划有很大的回报。运算符函数本身并不是可变参数,并且具有有意义的参数名称。在以前的版本中,每个op函数都直接操作堆栈(大量tos [-1],tos [-3])。 – 2013-02-19 18:50:37

相关问题