【问题标题】:A macro for expanding an arbitrary macro a certain number of times?用于扩展任意宏一定次数的宏?
【发布时间】:2016-09-19 16:55:11
【问题描述】:

我想编写一个 C 宏,它采用整数文字或类似于整数文字的东西,以及另一个宏的名称,并将另一个宏扩展为整数文字的值的次数,并使用索引作为参数,例如

MAGIC(4, FUN)

扩展到

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

如果相反,我会使用 MORE_MAGIC 来获取范围开始和长度,那就更好了:

例如

MORE_MAGIC(1, 3, FUN)

扩展到

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

注意:

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

【问题讨论】:

  • 你为什么要这个?扩展为 for 循环怎么样?
  • “你不能对 FUN 做出假设”和“使用模板”根本不兼容。通过允许使用模板,您可以让人们对 FUN 做出假设。听起来您不想说为什么要这样做,因为您认为自己最了解,但是您问题中的注释已经使我对此表示怀疑。
  • 另外,编辑一个问题以取消现有答案的资格,该答案清楚地提供了您所要求的内容,这几乎没有完成,您应该已经知道了。
  • @hvd:恕我直言 1. 一开始就是一个无效的答案。 2. 当问题被误解或 OP 对他到底在问什么不够清楚时,通常会这样做。
  • @hvd:我只是想让解决方案使用模板(虽然我不确定这是否真的有用)

标签: c++ c macros metaprogramming


【解决方案1】:

Boost Preprocessor 是一个扩展库,专注于这种预处理器的魔力。

它提供了一个名为 BOOST_PP_REPEAT_FROM_TO 的宏,它完全可以满足您的需求。

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

【讨论】:

  • 是否可以只提取 BOOST_PP_REPEAT_FROM_TO 而无需所有 Boost 预处理器库?
  • @einpoklum 我的理解是 Boost 预处理器库是独立的,不需要 Boost 的其余部分。不过,我不确定您是否可以从 Boost Preprocessor 中提取单个组件。
  • 通过“Modular Boost”项目的努力,PP的单机版已经上线here。仅提取REPEAT_FROM_TO 会相当困难,但您可以在 中仅包含所需的位
  • (替换了之前的评论)@zah:我查过了,这个解决方案至少需要 6647 行代码(使用 Boost 1.60)。当然,理论上可以通过手工进一步减少它——只包括必要的部分。
  • @einpoklum,我不会太担心。预处理器技巧对编译时间的影响非常小,这总是让我感到惊讶。当您考虑将琐碎的文本替换与编译器为了获得最终的可执行代码需要做的其他事情进行比较时,它们会更有意义。
【解决方案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;
}

【讨论】:

  • 这不能回答我的问题。另见编辑。此外,您还发布了无数条 printf 指令!
  • @einpoklum 如果你告诉我们你为什么需要这个,以及 for 循环不会做的一些情况,我们可以更好地回答。我唯一能想到的就是声明变量,如果你想声明这么多编号的变量,你需要一个宏,你可能应该重新考虑为什么需要这么多变量。
  • @einpoklum 不知道您所说的“您正在发出无数个 printf 指令”是什么意思;它打印 11 行,它们仅用于演示目的。您的编辑似乎并没有太大改变问题。如果你不想说这是为了什么,你的电话对我来说没有多大意义。
  • 假设您处于多线程上下文中。如果您将打印拆分为多个 printf 指令,这一切都会变得混乱。
  • @einpoklum 我有兴趣对此进行演示。
猜你喜欢
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多