关于宏

时间:2009-12-04 13:59:25

标签: c macros

我正在寻找可以扩展如下的宏:

FILL_BUFF(4)应扩展为(0xFF,0xFF,0xFF,0xFF)...为上述扩展编写的宏可以是什么..

4 个答案:

答案 0 :(得分:2)

宏没有条件控件,例如循环 - 它们非常简单。

在标题中看到一组包含所有常见扩展的宏是很常见的,例如


#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 :(得分:2)

PP得到了它 - 几乎。 再次滥用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 :(得分:2)

您可能需要查看boost preprocessor library。特别是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 };

答案 3 :(得分:1)

嗯,也许是通过memset:

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

但我不确定这是个好主意