c - 将参数反转为可变参数宏

标签 c c-preprocessor c99 variadic-macros

如何反转可变参数宏的参数?例如,我想要

#define REVERSE(...) ???

REVERSE(A,B,C) // expands to C,B,A

我的目标是将前后参数分开:

#define APPLY(FUN,...) FUN(__VA_ARGS__)

#define FRONT(FIRST,...) FIRST
#define REST(FIRST,...) __VA_ARGS__
#define MOST(...) APPLY(REVERSE,APPLY(REST,REVERSE(__VA_ARGS__)))
#define BACK(...) APPLY(FRONT,REVERSE_ARGUMENTS(__VA_ARGS__))

FRONT(A,B,C) // expands to A
REST(A,B,C) // expands to B,C
MOST(A,B,C) // expands to A,B
BACK(A,B,C) // expands to C

最佳答案

Boost Preprocessor Library可以反转宏参数。不幸的是,它只能达到实现定义的最大参数列表长度。据我所知,不可能编写一个反转任意长参数列表的宏。

#include <boost/preprocessor.hpp>

#define REVERSE(...) BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_REVERSE(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)))

#define APPLY(FUN,...) FUN(__VA_ARGS__)

#define FRONT(FIRST,...) FIRST
#define BACK(...) APPLY(FRONT,REVERSE(__VA_ARGS__))
#define REST(FIRST,...) __VA_ARGS__
#define MOST(...) APPLY(REVERSE,APPLY(REST,REVERSE(__VA_ARGS__)))

关于c - 将参数反转为可变参数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14365837/

相关文章:

c - 如何在C中用数组填充结构的指针元素

c - 用值加载堆栈指针是特权指令吗?

c - SDL 2.0 : How to get the HWND from SDL_SysWMinfo

c - 自动编译所有 ifdef/ifndef 指令的工具

timer - 在没有高/低字节锁存器的 8 位系统上读出 16 位定时器

c++ - cc1.exe 系统错误 - 缺少 libwinpthread-1.dll - 但它不是

取决于 gcc 开关的条件代码

c - 为什么这个 C 程序符合并运行

c - C 中数组索引的正确类型是什么?

c - 如何在 Linux 中使用麦克风获取原始格式的语音