Относительно макросов - PullRequest
       16

Относительно макросов

1 голос
/ 04 декабря 2009

Я искал макрос, который может расширяться следующим образом:

FILL_BUFF (4) должен быть расширен как (0xFF, 0xFF, 0xFF, 0xFF) ... что может быть написано макросом для указанного расширения.

Ответы [ 4 ]

2 голосов
/ 04 декабря 2009

Возможно, вы захотите взглянуть на библиотеку препроцессора boost . Особенно макросы BOOST_PP_REPEAT_z:

#define DECL(z, n, text) text ## n = n;

BOOST_PP_REPEAT(5, DECL, int x)

Результат:

int x0 = 0; int x1 = 1; int x2 = 2; int x3 = 3; int x4 = 4;

В вашем случае вы можете сделать:

#define FILL_BUFF_VALUE(z, n, text) text,
#define FILL_BUFF(NPLUSONE, VALUE) { BOOST_PP_REPEAT(NPLUSONE, FILL_BUFF_VALUE, VALUE } VALUE )

int anbuffer[] = FILL_BUFF(4 /* +1 */,0xff); // anbuffer will have length 5 afterwards

, который расширится до

int anbuffer[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
2 голосов
/ 04 декабря 2009

ПП понял - почти. Злоупотребление препроцессором C снова. С другой стороны, он не заслуживает ничего лучшего.

#define FILL_BUFF(N) FILL_BUFF_ ## N

#define FILL_BUFF_1 (0xFF)
#define FILL_BUFF_2 (0xFF,0xFF)
#define FILL_BUFF_3 (0xFF,0xFF,0xFF)
#define FILL_BUFF_4 (0xFF,0xFF,0xFF,0xFF)
2 голосов
/ 04 декабря 2009

Макросы не имеют условных элементов управления, таких как циклы - они очень просты.

Обычно в заголовке встречается группа макросов, охватывающих все общие расширения, например,


#define FILL_BUFF_1 (0xFF)
#define FILL_BUFF_2 (0xFF,0xFF)
#define FILL_BUFF_3 (0xFF,0xFF,0xFF)
#define FILL_BUFF_4 (0xFF,0xFF,0xFF,0xFF)
1 голос
/ 04 декабря 2009

Хм, возможно через memset:

#define FILL_BUFF(buf, n) memset(buff, 0xff, n)

Но я не уверен, что это хорошая идея

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