2016-07-14 124 views
-3

我有一个C函数,它的自定义结构和具有不同类型(整型/串/其他自定义结构...)参数的可变的量。由于结构,函数可以确定每个参数的类型,以便处理它。传递变量参数的函数

void doStuff(MyStruct *S,...){ <function code> } 

现在我需要另一个函数,可以传递'n'个常量参数到“doStuff”。即是这样的:

void useDoStuff(Mystruct *S, int n){ //lets say n=4 
    va_list arguments; 
    int i; 
    for(i = 0 ; i < n ; i++){ 
     if(i%2) arguments.add(6); //example condition for the arguments 
     else arguments.add("Hello"); 
    } 
    doStuff(S, arguments); // doStuff(S, "Hello", 6, "Hello", 6); 
} 

当然,这不会工作,因为va_list的不能这样使用(它只能用于粗略“可视化”所需要的)。不幸的是,结构和“doStuff”功能都无法更改,我需要找到解决方法。这种解决方法是否存在?

+6

这不是C,它是C++(C没有明确提及)。这是一个XY问题。你为什么试图创建一个异构的参数列表? “doStuff”的_actual_定义是什么? – Tim

+0

是的你是正确的没有在C中的引用(不知道为什么我用它们而不是示例中的指针)。无论如何,doStuff做什么并不重要,关键是我必须传递未知数量的常量参数来通过某些条件。 –

+0

Quote:“自然这不会工作,因为va_list不能像这样使用(仅用于大致'可视化'需要)”。我的意思是... va_list是否具有“添加”功能? - 没有。 –

回答

2

C没有定义任何机构,用于动态地构造变量参数列表。通常,编译器将可变参数调用转换为普通函数调用,使用实现特定的机制来处理调用两端的参数列表。为此,编译器需要知道每个调用的实际参数是什么。

如果一切最终必须经过可变参数的功能,那么你所有的选择都在变化无论是写多个替代函数调用和动态选择执行哪一个,或者通过多个函数调用进行的工作。将这些结合起来也许是可能的。

考虑,然而,可变参数函数的行为的适当部分是否可以被提取出来,它可以直接行使。然后你可以说,提供一个或多个可选的前端,接受数据以结构数组的形式使用,而不是可变参数。