C中可变数量的args和面向设计的问题的函数

时间:2009-08-11 12:44:11

标签: c design-patterns variadic-functions

我有一个名为SetParams(...)的C函数,其参数可变。此函数设置静态数据结构(让我们将其命名为Data)。 SetParams与参数对一起使用,例如SetParams("paramA", paramA_value, "paramB", paramB_value)等。也可以多次调用e.g.

SetParams("paramA", paramA_value);
SetParams("paramB", paramB_value);
...

当设置了所有'参数'后,调用另一个函数(我们将其命名为Execute),该函数不带参数:

Execute();
// uses data from static 'Data' and performs error_handling and execution

我想知道我是否可以以面向对象的方式构建这种代码。所以,我想要一些建议,尤其是错误处理,因为一些args可能与其他args相矛盾。

4 个答案:

答案 0 :(得分:2)

在C中创建面向对象设计的一般做法是,您将通过对结构的引用传递的每个方法,该结构用于存储所有类成员变量。换句话说,在C ++中,您拥有listObj.clear()中的list_clear(&listObj)

这有点难看,但除非您想使用静态成员变量并将实现限制为仅使用一次,否则这是必要的。

在下面的示例中,请注意每个方法中如何传入对结构ParamUtilObj的引用。

// --- paramUtil.h

// Stores all the objects member variables (public and private)
struct ParamUtilObj {
  int paramCnt;
  char param1[25];
  char param2[25];
  ...
};

bool paramUtil_initialize( struct* ParamUtilObj pData );
bool paramUtil_addParam( struct* ParamUtilObj pData, const char* pKey, const char* pValue );
bool paramUtil_execute( struct* ParamUtilObj pData);

关于可变方法。如果可能的话,我会尽量避免使用它们,然后一次添加一个。在我看来,验证params的业务逻辑是一个完全不同的主题。我需要更多信息来推荐最佳方法。但是......在我看来,因为你将不得不进行验证,例如if(MethodA)然后检查是否存在其他一些参数......为每个MethodType创建几个SetParam方法可能更容易可以在脚本中指定。

答案 1 :(得分:1)

我建议使用链表来存储你的参数,并将所有方法作为函数指针放到结构中。

struct MyClass {
  struct LinkedList* params;
  void (*setParams)(...);
  void (*execute)()
}

链表是一个键值对

struct LinkedList {
   struct LinkedList *next;
   char * key;
   char * value;
}

答案 2 :(得分:0)

我不知道你是如何实现你的SetParams的,它只是做了一点点的解析和存储,并将错误处理下游转发到Execute调用。 由于您使用的是可变长度参数,您使用的是va_ *宏吗?使用格式字符串执行此操作可能允许您将错误处理插入到SetParams调用中,并允许Execute迭代值并执行其操作。

通常,如果您有一个处理设置参数的函数,那么您应该管理与设置参数相关的错误。执行命令时遇到的错误应该在执行函数中解决。

答案 3 :(得分:0)

你不能这样做,因为在C中,可变参数函数不知道你提供的参数的数量,所以你需要以某种方式让函数知道它,比如指定params的数量作为第一个参数或使用{{1当格式字符串可以找到参数个数时。