C에서 배열크기가 define값에 의존적일때 초기화도 이 값에 의존적으로 할 방법이 있을까요?

lvheart의 이미지

즉 아래와 같은 코드에서

#define MAX_NUM 2
#define INIT_VAL 1
void TEST(void)
{
  static array[MAX_NUM] = {INIT_VAL, INIT_VAL};
 ...
}

MAX_NUM 이 변할 때 초기값도 자동으로 세팅되게 하고 싶은데

#define MAX_NUM 3
#define INIT_VAL 1
#define ARRAYINIT(x) ...//INIT_VAL, 를 x개수만큼 만드는 매크로
 
void TEST(void)
{
 static array[MAX_NUM] = {ARRAYINIT(MAX_NUM)};
 ...
}

이렇게 할 수 있는 방법이 있을까요?

planetarium의 이미지

for 문은 배제하신 거죠?

lvheart의 이미지

네. 이 함수는 한번만 수행되는 함수가 아니라서 compile시에
초기화 되어야 합니다.

bushi의 이미지

원하는 부분을 한번만 수행되도록 하는 방법은 많습니다.

OTL

lugi의 이미지

#define MAX_NUM 3
#define INIT_VAL 1

void TEST(void)
{
static int array[MAX_NUM] = {INIT_VAL,};
...
}

위와 같이 콤마를 찍어주면, 모두 INIT_VAL로 초기화되지 않나요?

--------------------------------------------------------------------------------------
조금씩이라도 전진한다.

winner의 이미지

냉무

klara의 이미지

덧붙이자면 ,가 있던 없던 지정되지 않은 부분은 전부 0이 됩니다.

cinsk의 이미지

GCC 확장 기능으로, 범위(range)를 지정해서 초기화하는 방법이 있습니다. 예를 들면:

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

따라서 질문의 답은:

#include <stdio.h>
 
#define MAX_NUM 10
#define INIT_VAL 1
 
void foo(void)
{
  static int array[] = { [0 ... (MAX_NUM - 1)] = INIT_VAL };
  /* ... */
}

다시 말하지만, GCC 확장 기능입니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/