是否可以创建一个ONLY_EVEN()宏来执行以下转换:
ONLY_EVEN()
ONLY_EVEN0() ONLY_EVEN2(a,b) b ONLY_EVEN4(a,b,c,d) b,d
有任意数量的参数,使用可变参数宏参数?
zyfwsgd61#
对于 * 无限 * 数量的参数可能不会。然而,对于任意数量的参数,它是可能的,例如,下面是一个自包含的宏解决方案,可以在[0..6]中支持任意数量的参数,它可以用显而易见的方式扩展,以支持任意数量的参数。
#define ONLY_EVEN0(a) #define ONLY_EVEN1(a) #define ONLY_EVEN2(a,b) b #define ONLY_EVEN3(a,b,c) b #define ONLY_EVEN4(a,b,c,d) b,d #define ONLY_EVEN5(a,b,c,d,e) b,d #define ONLY_EVEN6(a,b,c,d,e,f) b,d,f #define ONLY_EVEN_N(a,b,c,d,e,f,n,...) ONLY_EVEN##n #define ONLY_EVEN(...) ONLY_EVEN_N(__VA_ARGS__,6,5,4,3,2,1,0)(__VA_ARGS__) // example: 0: ONLY_EVEN() 1: ONLY_EVEN(A) 2: ONLY_EVEN(A,B) 3: ONLY_EVEN(A,B,C) 4: ONLY_EVEN(A,B,C,D) 5: ONLY_EVEN(A,B,C,D,E) 6: ONLY_EVEN(A,B,C,D,E,F)
$ g++ -std=c++11 -pedantic -E onlyeven.cpp | grep -v '#' 0: 1: 2: B 3: B 4: B,D 5: B,D 6: B,D,F
注意,根据C/C ++规范,预处理器最多只能接受256个参数。
1条答案
按热度按时间zyfwsgd61#
对于 * 无限 * 数量的参数可能不会。
然而,对于任意数量的参数,它是可能的,例如,下面是一个自包含的宏解决方案,可以在[0..6]中支持任意数量的参数,它可以用显而易见的方式扩展,以支持任意数量的参数。
注意,根据C/C ++规范,预处理器最多只能接受256个参数。