gpt4 book ai didi

macros - 可变递归预处理器宏 - 可能吗?

转载 作者:行者123 更新时间:2023-12-03 07:16:41 25 4
gpt4 key购买 nike

我遇到了一些理论问题。在我维护的一段代码中,有一组宏,例如

#define MAX_OF_2(a, b)       (a) > (b) ? (a) : (b)
#define MAX_OF_3(a, b, c) MAX_OF_2(MAX_OF_2(a, b), c)
#define MAX_OF_4(a, b, c, d) MAX_OF_2(MAX_OF_3(a, b, c), d)
...etc up to MAX_OF_8

我想做的就是用这样的东西替换它们:

/* Base case #1, single input */
#define MAX_OF_N(x) (x)

/* Base case #2, two inputs */
#define MAX_OF_N(x, y) (x) > (y) ? (x) : (y)

/* Recursive definition, arbitrary number of inputs */
#define MAX_OF_N(x, ...) MAX_OF_N(x, MAX_OF_N(__VA_ARGS__))

...当然,这不是有效的预处理器代码。

忽略这种特殊情况可能应该使用函数而不是预处理器宏来解决,是否可以定义可变参数 MAX_OF_N() 宏?

为了清楚起见,最终结果应该是一个单独的宏,它接受任意数量的参数并计算其中最大的参数。我有一种奇怪的感觉,这应该是可能的,但我不知道如何实现。

最佳答案

可以编写一个计算其调用参数数量的宏。 (我找不到第一次看到它的链接。)因此,您可以编写 MAX_OF_N() ,它可以按照您的意愿工作,但您仍然需要所有编号的宏,直到达到某个限制:

#define MAX_OF_1(a)         (a)         
#define MAX_OF_2(a,b) max(a, b)

#define MAX_OF_3(a,...) MAX_OF_2(a,MAX_OF_2(__VA_ARGS__))
#define MAX_OF_4(a,...) MAX_OF_2(a,MAX_OF_3(__VA_ARGS__))
#define MAX_OF_5(a,...) MAX_OF_2(a,MAX_OF_4(__VA_ARGS__))
...
#define MAX_OF_64(a,...) MAX_OF_2(a,MAX_OF_63(__VA_ARGS__))

// NUM_ARGS(...) evaluates to the literal number of the passed-in arguments.
#define _NUM_ARGS2(X,X64,X63,X62,X61,X60,X59,X58,X57,X56,X55,X54,X53,X52,X51,X50,X49,X48,X47,X46,X45,X44,X43,X42,X41,X40,X39,X38,X37,X36,X35,X34,X33,X32,X31,X30,X29,X28,X27,X26,X25,X24,X23,X22,X21,X20,X19,X18,X17,X16,X15,X14,X13,X12,X11,X10,X9,X8,X7,X6,X5,X4,X3,X2,X1,N,...) N
#define NUM_ARGS(...) _NUM_ARGS2(0, __VA_ARGS__ ,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)

#define _MAX_OF_N3(N, ...) MAX_OF_ ## N(__VA_ARGS__)
#define _MAX_OF_N2(N, ...) _MAX_OF_N3(N, __VA_ARGS__)
#define MAX_OF_N(...) _MAX_OF_N2(NUM_ARGS(__VA_ARGS__), __VA_ARGS__)

现在 MAX_OF_N(a,b,c,d,e) 将计算为 max(a, max(b, max(c, max(d, e)))) 。 (我已经在 gcc 4.2.1 上进行了测试。)

请注意,基本情况 (MAX_OF_2) 在扩展中不要多次重复其参数(这就是我在此示例中放置 max 的原因),这一点至关重要)。否则,您将在每个级别将扩展的长度加倍,因此您可以想象 64 个参数会发生什么:)

关于macros - 可变递归预处理器宏 - 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/824639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com