这不可能。 对于有限数量的标记,这是可能的,但你必须有一个字典的所有可能的标记,你想处理。整个过程中使用的替换空格与下划线在一个宏?在这里,我将重写它没有寻找只是为了好玩。 通常,您可以将列表的前面与前缀连接起来,如WORD_##__VA_ARGS__,其中__VA_ARGS__="a b c"。然后使用#define WORD_a a,,您可以将前导单词与其余单词分开。对每个令牌重复此过程,您可以创建单独令牌的列表。
// dictionary of all words
#define WORD_
#define WORD_a a,
#define WORD_b b,
#define WORD_c c,
#define WORD_d d,
#define TOKENIZE_1(a) WORD_##a
#define TOKENIZE_2(a,...) a, TOKENIZE_1(__VA_ARGS__)
#define TOKENIZE_3(a,...) a, TOKENIZE_2(__VA_ARGS__)
#define TOKENIZE_4(a,...) a, TOKENIZE_3(__VA_ARGS__)
#define TOKENIZE_5(a,...) a, TOKENIZE_4(__VA_ARGS__)
#define TOKENIZE_N(_5,_4,_3,_2,_1,N,...) TOKENIZE##N
#define TOKENIZE(...) TOKENIZE_N(__VA_ARGS__,_5,_4,_3,_2,_1)(__VA_ARGS__)
#define REMOVELAST_1(a)
#define REMOVELAST_2(a,...) a
#define REMOVELAST_3(a,...) a, REMOVELAST_2(__VA_ARGS__)
#define REMOVELAST_4(a,...) a, REMOVELAST_3(__VA_ARGS__)
#define REMOVELAST_5(a,...) a, REMOVELAST_4(__VA_ARGS__)
#define REMOVELAST_N(_5,_4,_3,_2,_1,N,...) REMOVELAST##N
#define REMOVELAST(...) REMOVELAST_N(__VA_ARGS__,_5,_4,_3,_2,_1)(__VA_ARGS__)
#define SPACES_TO_ARGS(...) REMOVELAST(TOKENIZE(TOKENIZE(TOKENIZE(TOKENIZE(__VA_ARGS__)))))
#define f(spaceargs) g(SPACES_TO_ARGS(spaceargs))
f(a b) to g(a, b)
f(a b c) to g(a, b, c)
f(a b c d) to g(a, b, c, d)
1条答案
按热度按时间0ve6wy6x1#
这不可能。
对于有限数量的标记,这是可能的,但你必须有一个字典的所有可能的标记,你想处理。整个过程中使用的替换空格与下划线在一个宏?在这里,我将重写它没有寻找只是为了好玩。
通常,您可以将列表的前面与前缀连接起来,如
WORD_##__VA_ARGS__
,其中__VA_ARGS__="a b c"
。然后使用#define WORD_a a,
,您可以将前导单词与其余单词分开。对每个令牌重复此过程,您可以创建单独令牌的列表。此外,是否有任何方法可以分离任意令牌?
不,这不可能。
任何第三方库,包括boost::preprocessor都是受欢迎的,因为这些库在预处理过程中工作。
我使用
BOOST_PP_WHILE
使它对任意数量的参数(直到boost限制)更加抽象。