0

我需要创建我的抽象数据类型的实例,但创建实例需要一些参数。现在,我应该如何将这些参数传递给函数?有很多参数,我希望它们中的大多数都是默认值。我看到了几种解决此问题的方法,但是我无法确定哪种方法最好。

第一个选项:

MyADT_t *my_adt_create( const char* a_long_config_string);

..哪里a_long_config_string是一个字符串"param1=value;param2=value"

这很吸引人,但我想函数内部的字符串解析(和错误检查)会很混乱。

第二种选择:

MyADT_t *my_adt_create( int paramc, char *paramv[]);

这模仿了命令行输入样式main(int argc, char *argv[]),并且可以使用命令行选项库来实现,例如 getopt 或 popt。

第三个选项:

使用可变参数函数,例如: MyADT_t *my_adt_create( int mandatory_param, ...);

..然后在函数中成对地读取参数和值。也许与第二种选择没有太大区别,但仍然不同。

附加信息:我猜工厂方法的一些参数将从命令行选项中提供。这会让选择变得更简单吗?

编辑
清除:如果我希望我的程序像这样启动:
myprog --some-general-opt=hello --adt-optinon-a=value --adt-option-b=value
或者可能:
myprog --some-general-opt=hello --adt-options='a_long_config_string'

4

1 回答 1

1

另一种选择:使用struct. 将其弹出到某个.h文件中,并将其传递给方法:这样,您将获得类型安全,并且调用函数完全清楚发生了什么。

您的结构示例typedef(未编译):

   typedef struct {
      int  size;
      char content_flags;
      ...
   } ADT_PARAMS;

然后,在您的ADT.c文件中:

MyADT_t *my_adt_create(ADT_PARAMS *p) {
    ...
}

为了处理来自命令行的参数,有一个getargs函数可以解决一般获取命名参数的问题,我个人更喜欢用 敲一些东西sscanf,所以像

const char *fmt = "--%s=%s";
int main(int argc, char **argv) 
{
    int i;
    const ADT_PARAMS p = {..default ADT parameters}
    for(i = 1; i < argc; i++) {
       char *key, *value;
       char *cur = *(argv + i);
       if(!sscanf(fmt, &key, &value)) {
           fprintf(stderr, "Error reading argument: '%s'\n", cur);
           return 1;
       }
       if(!strcmp(key,"some-value")) {
           p.some-value = ...
       }
    }
}
于 2013-06-16T20:56:19.570 回答