Gio*_*hal 5 c++ c-preprocessor
是否可以定义BUILD(a, i)扩展为" x[0], x[1], x[2], ..., x[i]" 的C/C++宏" "?像
#define BUILD(x, 0) x[0]
#define BUILD(x, 1) x[0], x[1]
#define BUILD(x, 2) x[0], x[1], x[2]
...
Run Code Online (Sandbox Code Playgroud)
似乎BOOST_PP_ENUM_PARAMS可以完成这项工作.我想我可以#include boost,但我很想知道它是如何以及为什么有效,任何人都可以解释一下?
我想调用一个带有f(int, ...)N个int参数的函数x[i],0 <= i <N.其中N已知ceil(sizeof(A) / sizeof(B)).所以不幸的是,我不能使用varargs或模板.
APr*_*mer 14
这是可能的,但你必须做一些手工工作并有一个上限.
#define BUILD0(x) x[0]
#define BUILD1(x) BUILD0(x), x[1]
#define BUILD2(x) BUILD1(x), x[2]
#define BUILD3(x) BUILD2(x), x[3]
#define BUILD(x, i) BUILD##i(x)
Run Code Online (Sandbox Code Playgroud)
请注意,i应该是整数文字,而不是常量计算值.
顺便说一句,预处理器比通常更强大,但使用这种功能非常棘手.Boost提供了一个可以简化某些事情的库,包括迭代.请参阅Boost预处理器库.还有另一个图书馆可供这样的东西,但它的名字目前逃脱了我.
编辑:boost预处理器库使用类似的技术.通过额外的技巧来解决一些极端情况问题,在更高级别的设施之间共享实现宏,解决编译器错误等...通常的增强复杂性,这在通用库的上下文中是正常的,但有时会妨碍对实施原则.可能最引人注目的技巧是添加间接级别,这样如果第二个参数可以是宏,它就会被扩展.即
#define BUILD_(x, i) BUILD##i(x)
#define BUILD(x, i) BUILD_(x, i)
Run Code Online (Sandbox Code Playgroud)
一个人可以打电话
#define FOO 42
BUILD(x, FOO)
Run Code Online (Sandbox Code Playgroud)
这与我暴露的东西是不可能的.