用于扩展任意宏一定次数的宏?

时间:2016-05-22 22:30:27

标签: c++ c macros metaprogramming

我想编写C宏,它接受整数文字或类似于整数文字的东西,以及另一个宏的名称,并将其他宏扩展为整数字面值的多倍,并使用索引作为一个论点,例如

MAGIC(4, FUN)

扩展为

FUN(0) FUN(1) FUN(2) FUN(3)

相反,如果我的MORE_MAGIC需要一个范围的起点和长度,那就更好了:

e.g。

MORE_MAGIC(1, 3, FUN)

扩展为

FUN(1) FUN(2) FUN(3)

注意:

  • 我可以忍受扩展的数量,我不知道,99或50,或类似的东西。
  • 你不能对FUN做出假设。需要是通用的。不,这不适用于手动展开循环。
  • 最受欢迎的解决方案以及需要C ++的解决方案(例如,如果您以某种方式在解决方案中使用模板)。
  • 解决方案的总行数(包括#include但不包括注释)最好是适度的。说,不超过200。

2 个答案:

答案 0 :(得分:9)

Boost预处理器是一个广泛的库,专注于这种预处理器魔术。

它提供了一个名为BOOST_PP_REPEAT_FROM_TO的宏,它完全符合您的要求。

此处提供完整参考:
http://boost.org/libs/preprocessor

答案 1 :(得分:-2)

你想要的基本上是一个展开的for循环...但你没有说出你想要的原因。您可以创建一个创建for循环的宏,并信任编译器来决定它是否值得展开。

#include <stdio.h>

#define PRINT_INT(i) printf("%d\n", i);
#define MORE_MAGIC(start, end, function) for(int i = start; i <= end; i++) { function(i); }
#define MAGIC(end, function) MORE_MAGIC(0, end, function)

int main() {
    puts("MAGIC!");
    MAGIC(3, PRINT_INT);

    puts("MORE_MAGIC!");
    MORE_MAGIC(2, 6, PRINT_INT);

    return 0;
}