инициализация структуры

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

Моя программа сохраняет аргументы командной строки в структуру. Когда-то все участники устанавливаются... иногда только пара из них.

В случае, когда задан только arg1, какова будет наилучшая практика с остальными членами?

Спасибо.

  • 0
    Прежде чем выбрать лучшее решение, я рекомендую изучить термины «POD» и «Aggregate», чтобы решить, нужны ли они для этого типа. «Args» в настоящее время является типом POD. Скорее всего, решение, предложенное «wrang-wrang», приведет к тому, что ваш тип не будет POD или Aggregate. Решение, предложенное ZZ Coder, требует, чтобы тип был POD.
Теги:
data-structures
initialization

5 ответов

2
Лучший ответ

Я бы просто все понял. Любое значение 0 или нулевой указатель не принимается.

Например,

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

  ...

  if (arg.arg2 == 0) // Not set
  • 0
    Скорее memset(&arg, 0, sizeof(arg))
4

Я бы использовал необязательный тип с флагом, например. 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
};
3

Обычно, когда аргумент опущен, вместо него используется значение по умолчанию. Если это имеет смысл, просто поместите такие значения по умолчанию в структуру, как если бы они были предоставлены в качестве аргументов.

В качестве альтернативы обычно устанавливается (char *) s в NULL в таких случаях. (Обратите внимание, что можно отличить пустую строку "" от NULL, и это может быть полезно также.)

Целые числа часто устанавливаются на какое-то "недопустимое" значение, например 0 или -1 (это зависит от того, какие значения действительны). Для unsigned вы можете использовать 0xFFFFFFFF.

2

Как отметил Артелиус, вы можете установить их значения по умолчанию. В таких случаях принято указывать указатели на NULL. С целыми числами вы хотели бы, чтобы у них было другое значение, которое не будет путать остальную часть кода, например -1.

2

Если вы работаете в обычном режиме, используйте GNU gengetopt или подражайте используемому в нем подходу (который должен иметь переменную флагов, которая сообщает если установлены дополнительные аргументы). Стандарты c не дают вам поддержки (вскоре будет выпущен стандарт С++).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню