구조체를 원소로 가지는 배열의 초기화 관련

superkkt의 이미지

struct code {
	char	*c_name;
	int	c_val;
};

static struct code	PriNames[] = {
	"panic",	LOG_EMERG,
	"emerg",	LOG_EMERG,
	"alert",	LOG_ALERT,
	"crit",		LOG_CRIT,
	"err",		LOG_ERR,
	"error",	LOG_ERR,
	"warn",		LOG_WARNING,
	"warning", 	LOG_WARNING,
	"notice",	LOG_NOTICE,
	"info",		LOG_INFO,
	"debug",	LOG_DEBUG,
	NULL,		-1
};

위에서 PriNames[] 배열을 초기화 할때요.. 아래와 같이 해야 정상 아닌가요?

static struct code	PriNames[] = {
	{"panic",	LOG_EMERG},
	{"emerg", LOG_EMERG},
	{"alert",	LOG_ALERT},
                 ..생략..
	{NULL,		-1}
};
doldori의 이미지

둘 다 맞습니다. 아래쪽이 알아보기 쉽다는 점은 있겠지요.

죠커의 이미지

둘다 정상이고 designated initialize라는 희귀한 형식이 결합될 수 도 있습니다.

체스맨의 이미지

둘 다 맞긴 합니다만, 두번째처럼 하지 않으면 Warning 내는
컴파일러가 있습니다.

그리고, 두번째 방법이 더 좋은 방법입니다. 예를 들어,
아래와 같이 extra 멤버가 더 추가됐을 때,

struct code {
	char	*c_name;
	int	c_val;
	int     extra;
};

두번째 방법은 기본적으로 extra 가 0 으로 초기화 되고,
0 이외의 값이 아닌 경우는 그냥 두면 됩니다.
하지만 첫번째 방법은 컴파일 오류가 나겠죠.

다차원 배열이든, 구조체 안에 구조체가 있든 모든 경우에서
되도록 두번째처럼 하시는 게 좋습니다.

Orion Project : http://orionids.org