C++和C中的变量参数列表

Sco*_*ott 4 c c++ parameters optional-parameters

我正在使用C++重写C程序以利用OO方面,因此它可以轻松支持多个设备,并且程序的一部分是表达式评估程序.表达式可以有函数调用,这里是函数的结构.

typedef struct {
    char *name;
    int argc;
    void (*func) ();
} FUNCTION;
Run Code Online (Sandbox Code Playgroud)

不知何故,func可以通过它传递可变数量的参数.

RESULT *param[10];

if (Root->Function->argc < 0) {
    /* Function with variable argument list:  */
    /* pass number of arguments as first parameter */
    Root->Function->func(Root->Result, argc, &param);
} else {
    Root->Function->func(Root->Result, param[0], param[1], param[2], param[3], param[4], param[5], param[6],
                         param[7], param[8], param[9]);
}
Run Code Online (Sandbox Code Playgroud)

老实说,我甚至不确定如何在C中做到这一点.解释会非常好.可以用C++完成吗?

Thi*_*tte 8

变参是你在找什么.它适用于C和C++.这就是printf()用于例如:)的内容.

您可以通过googling va_arg(用于可变数量参数的函数之一)找到更多信息

  • 注意变量参数的局限性.您不能通过省略号传递任何类型的对象. (3认同)

Mat*_* M. 6

其实我会反对这里的每一个人,以及你的愿望.

省略号是错误的.它被认为是C中不可或缺的,但从那以后我们学到了更好的东西.

实际上,有些方法可以在C++中实现更好,使用对象,例如函数对象.

您正在寻找的是命令模式.

创建一个名为'Command'的基类(带有execute()方法的接口),然后为你想要放入'void(*func)()'的每个'函数'创建一个派生类.

现在,您的代码将如下所示:

std::vector<RESULT*> param(10, NULL);

if (Root->Function->argc < 0) {
    /* Function with variable argument list:  */
    /* pass number of arguments as first parameter */
    Command1* aCommand = new Command1(Root->Result);
    aCommand->set(Root->Result, argc, &param);
    Root->Function->command = aCommand;
    Root->Function->command->execute();
} else {
    Command2* aCommand = new Command2(Root->Result);
    aCommand->set(Root->Result, param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], param[8], param[9]);
    Root->Function->command = aCommand;
    Root->Function->command->execute();
}
Run Code Online (Sandbox Code Playgroud)

在这里,您不需要省略号,因为每个命令对象都是专用的,并且确切地知道它需要什么参数(数量和类型).

命令模式允许您获得"..."(省略号)的所有好处而不会带来不便.当然有些人会说这是一个时间的浪费,因为他们不会犯错误,所以他们不需要输入更多...不幸的是我不是那么聪明所以我更喜欢定义约束(数量,类型) ,断言)并让编译器为我强制执行它们.