结构初始化

时间:2009-09-17 00:53:39

标签: c++ c data-structures initialization

static struct Args {
  char*  arg1;
  unsigned arg2;
  unsigned arg3;
  char*  arg4;
} arg;

我的程序将命令行参数保存到结构中。有时所有成员都被设置......有时只有几个成员。

在只设置了arg1的情况下,最好的做法是与其他成员一起做什么?

感谢。

5 个答案:

答案 0 :(得分:4)

我使用标记的可选类型,例如Boost.Optional。虽然您可以使用NULL作为指针,但您也可以使用optional<char *>optional<int>

如果你坚持使用NULL,你可能会认为某些int值不是合法的输入(例如(unsigned)-1);如果用户提供它们,您可以拒绝它们,并使用它们来表示“没有提供选项”。

可选包装器的本质是:boolean标志用于是否存在选项,以及包装数据类型,例如:

template <class T>
struct optional<T> {
 T val;
 bool none;
 bool have() { return !none; }
 optional() : none(true)
 optional(T const& val) : val(val),none(false) {}
 void operator=(T const& t) { none=false; val=t; }
 // etc; make none and val private if you wish
};

答案 1 :(得分:3)

通常在省略参数时,程序会使用某些默认值。如果有意义,只需将这些默认值放入结构中,就像它们作为参数一样提供。

或者,在这种情况下将(char *)s设置为NULL是很常见的。 (注意,可以将空字符串“”与NULL区分开来,这也可能很有用。)

整数通常设置为某个“无效”值,如0或-1(这取决于哪些值有效)。对于无符号,您可以使用0xFFFFFFFF。

答案 2 :(得分:2)

如果你在普通c中工作,请考虑使用GNU gengetopt,或模仿其中使用的方法(这是有一个标志变量,告诉我是否设置了可选参数)。 c标准为您提供不支持(即将发布的c ++标准)。

答案 3 :(得分:2)

我会忘记整件事。假定未设置任何0值或空指针。

例如,

  memset(&arg, 0, sizeof(arg));

  ...

  if (arg.arg2 == 0) // Not set

答案 4 :(得分:2)

正如Artelius指出的那样,您可以将它们设置为默认值。在这种情况下,通常将指针设置为NULL。对于整数,您可能希望它们具有其他值,这些值不会混淆代码的其余部分,例如-1。