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

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

1 голос
/ 17 сентября 2009
static struct Args {
  char*  arg1;
  unsigned arg2;
  unsigned arg3;
  char*  arg4;
} arg;

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

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

Спасибо.

Ответы [ 5 ]

4 голосов
/ 17 сентября 2009

Я бы использовал помеченный необязательный тип, например, Boost.Optional . Хотя вы можете использовать NULL для указателей, вы также можете использовать optional<char *> и optional<int>.

Если вы настаиваете на использовании NULL, вы можете решить, что некоторые значения int не являются допустимыми (например, (без знака) -1); Вы можете отклонить их, если пользователь предоставит их, и использовать их для обозначения «опция не указана».

Суть необязательного упаковщика заключается в следующем: логический флаг, указывающий, присутствует ли параметр, и обернутый тип данных, например ::10000

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 голосов
/ 17 сентября 2009

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

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

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

2 голосов
/ 17 сентября 2009

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

2 голосов
/ 17 сентября 2009

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

Например,

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

  ...

  if (arg.arg2 == 0) // Not set
2 голосов
/ 17 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...