c++ - 有没有办法在可变参数宏参数上使用 C++ 预处理器字符串化?

标签 c++ macros arguments variadic stringification

我的猜测是这个问题的答案是否定的,但如果有办法,那就太棒了。为了澄清,假设我有以下宏:

#define MY_VARIADIC_MACRO(X...) // Does some stuff here in the macro definition

我想做的是在将 X 的所有变量传递给可变参数函数之前以某种方式对其进行字符串化;这里的关键字是之前。我意识到没有办法真正从宏定义中访问各个参数,但是有没有办法将所有参数字符串化,可能类似于以下内容?

#define MY_VARIADIC_MACRO(X...) some_variadic_function("some string", #X)

最佳答案

您可以使用各种递归宏技术来处理可变参数宏。例如,您可以定义一个 NUM_ARGS 宏来计算可变参数宏的参数数量:

#define _NUM_ARGS(X100, X99, X98, X97, X96, X95, X94, X93, X92, X91, X90, X89, X88, X87, X86, X85, X84, X83, X82, X81, X80, X79, X78, X77, X76, X75, X74, X73, X72, X71, X70, X69, X68, X67, X66, X65, 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_ARGS(__VA_ARGS__, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 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)

然后,您可以编写一个 FOREACH 宏,为列表的每个元素扩展另一个宏:

#define EXPAND(X)       X
#define FIRSTARG(X, ...)    (X)
#define RESTARGS(X, ...)    (__VA_ARGS__)
#define FOREACH(MACRO, LIST)    FOREACH_(NUM_ARGS LIST, MACRO, LIST)
#define FOREACH_(N, M, LIST)    FOREACH__(N, M, LIST)
#define FOREACH__(N, M, LIST)   FOREACH_##N(M, LIST)
#define FOREACH_1(M, LIST)  M LIST
#define FOREACH_2(M, LIST)  EXPAND(M FIRSTARG LIST) FOREACH_1(M, RESTARGS LIST)
#define FOREACH_3(M, LIST)  EXPAND(M FIRSTARG LIST) FOREACH_2(M, RESTARGS LIST)
        :

这反过来又允许您定义将每个参数字符串化的宏:

#define STRINGIFY(X)    #X
#define MY_VARIADIC_MACRO(...)    FOREACH(STRINGIFY, (__VA_ARGS__))

关于c++ - 有没有办法在可变参数宏参数上使用 C++ 预处理器字符串化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5957679/

相关文章:

c++ - 优雅地捕获 LoadLibrary() 错误

c++ - 互斥(在静态库中)

c - C 和 C++ 中的宏

linux - 如何修复 `--os-auth-token: expected one argument`扫视错误?

c++ - 如何在 C++ 中为采用 'const char*' 的函数提供 'char*' 参数?

c# - 在 C# 中使用运行时确定的 C++ DLL

c++ - C++ 中的矩阵和 vector 模板类

c++ - 条件宏文本替换

c++ - 宏没有用直接调用展开,而是用间接调用展开

ruby - Ruby 中最简洁/优雅/合适的方法参数解析