static struct Args {
char* arg1;
unsigned arg2;
unsigned arg3;
char* arg4;
} arg;
我的程序将命令行参数保存到结构中。有时所有成员都被设置......有时只有几个成员。
在只设置了arg1的情况下,最好的做法是与其他成员一起做什么?
感谢。
答案 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。