static struct Args {
char* arg1;
unsigned arg2;
unsigned arg3;
char* arg4;
} arg;
Моя программа сохраняет аргументы командной строки в структуру. Когда-то все участники устанавливаются... иногда только пара из них.
В случае, когда задан только arg1, какова будет наилучшая практика с остальными членами?
Спасибо.
Я бы просто все понял. Любое значение 0 или нулевой указатель не принимается.
Например,
memset(&arg, 0, sizeof(arg));
...
if (arg.arg2 == 0) // Not set
memset(&arg, 0, sizeof(arg))
Я бы использовал необязательный тип с флагом, например. Boost.Optional. Хотя вы можете использовать NULL для указателей, вы также можете использовать optional<char *>
, а также optional<int>
.
Если вы настаиваете на использовании NULL, вы можете решить, что некоторые значения int не являются легальными входами (например, (без знака) -1); вы можете отклонить их, если пользователь поставляет их, и использовать их для представления "без опции".
Сущность необязательной обертки: boolean flag для наличия опции, и тип данных с оболочкой, например:
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
};
Обычно, когда аргумент опущен, вместо него используется значение по умолчанию. Если это имеет смысл, просто поместите такие значения по умолчанию в структуру, как если бы они были предоставлены в качестве аргументов.
В качестве альтернативы обычно устанавливается (char *) s в NULL в таких случаях. (Обратите внимание, что можно отличить пустую строку "" от NULL, и это может быть полезно также.)
Целые числа часто устанавливаются на какое-то "недопустимое" значение, например 0 или -1 (это зависит от того, какие значения действительны). Для unsigned вы можете использовать 0xFFFFFFFF.
Как отметил Артелиус, вы можете установить их значения по умолчанию. В таких случаях принято указывать указатели на NULL. С целыми числами вы хотели бы, чтобы у них было другое значение, которое не будет путать остальную часть кода, например -1.
Если вы работаете в обычном режиме, используйте GNU gengetopt или подражайте используемому в нем подходу (который должен иметь переменную флагов, которая сообщает если установлены дополнительные аргументы). Стандарты c не дают вам поддержки (вскоре будет выпущен стандарт С++).