문제

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

내 프로그램은 Command Line Args를 구조로 저장합니다. 언젠가 모든 멤버가 설정되어 있습니다 ... 때로는 두 명만이 있습니다.

ARG1 만 설정된 경우, 모범 사례는 나머지 회원과 어떤 관련이 있습니까?

감사.

도움이 되었습니까?

해결책

나는 단지 모든 것을 memset 할 것입니다. 0 값 또는 널 포인터는 설정되지 않은 것으로 가정합니다.

예를 들어,

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

  ...

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

다른 팁

플래그가 지정된 선택 유형을 사용합니다 boost.optional. 포인터에 Null을 사용할 수 있지만 optional<char *> 뿐만 아니라 optional<int>.

NULL 사용을 고집하면 일부 Int 값이 법적 입력이 아니라고 결정할 수 있습니다 (예 : 서명 된) -1). 사용자가 공급하는 경우 거부하고 사용하여 "제공되지 않은 옵션 없음"을 나타냅니다.

옵션 래퍼의 본질은 다음과 같습니다. 옵션이 있는지 여부에 대한 부울 플래그 및 래핑 된 데이터 유형 (예 :

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 *)를 null로 설정하는 것이 일반적입니다. (참고, 빈 문자열을 "NULL과 구별 할 수 있으며 이것은 유용 할 수 있습니다.)

정수는 종종 0 또는 -1과 같은 "유효하지 않은"값으로 설정됩니다 (이것은 유효한 값에 따라 다름). 서명되지 않은 경우 0xffffffff를 사용할 수 있습니다.

일반 C에서 작업하는 경우 사용을 고려하십시오 gnu gengetopt, 또는 여기에 사용 된 접근법을 에뮬레이션합니다 (선택적인 인수가 설정되었는지 알려주는 플래그 변수가 있어야 함). C 표준은 지원을 제공하지 않습니다 (곧 C ++ 표준이 출시 될 예정).

Artelius가 지적했듯이 기본값으로 설정할 수 있습니다. 그러한 경우에 포인터를 null로 설정하는 것이 일반적입니다. 정수를 사용하면 -1과 같은 코드의 나머지 부분을 혼동하지 않는 다른 가치를 갖기를 원할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top