gpt4 book ai didi

c++ - 如何将可变参数宏的所有参数连接成带引号的字符串?

转载 作者:行者123 更新时间:2023-12-03 07:59:43 28 4
gpt4 key购买 nike

如何将可变参数宏的所有参数连接到带引号的字符串中?

下面是非可变参数宏的定义,它将 2 个参数连接成带引号的字符串:

#define TO_STRING(x) #x
#define CONCAT_STRINGIFY(x,y) TO_STRING(x##y)

像这样调用这个宏:

CONCAT_STRINGIFY(AAA,BBB)

...产生以下输出:

"AAABBB"

如何使宏 CONCAT_STRINGIFY(...) 可变参数,以便它接受任意数量的参数?

附注
该解决方案只能使用 C 或 C++ 预处理器,不能使用第 3 方库
顺便说一句:我没有将预处理器的输出传递给 C/C++ 编译器。

最佳答案

这是一个通用的解决方案。它最多可处理 342 个参数,但可以通过添加更多 EVAL 进行指数级扩展以处理更多参数。

#define EVAL1(...) __VA_ARGS__
#define EVAL2(...) EVAL1(EVAL1(EVAL1(EVAL1(__VA_ARGS__))))
#define EVAL3(...) EVAL2(EVAL2(EVAL2(EVAL2(__VA_ARGS__))))
#define EVAL4(...) EVAL3(EVAL3(EVAL3(EVAL3(__VA_ARGS__))))
#define EVAL5(...) EVAL4(EVAL4(EVAL4(EVAL4(__VA_ARGS__))))

#define EMPTY()

#define TUPLE_AT_1(a,b,...) b
#define CHECK(...) TUPLE_AT_1(__VA_ARGS__)
#define CAT_PROBE(...) ,CAT_END,

#define CAT_IND() CAT_
#define CAT_(x,a,...) CHECK(CAT_PROBE a,CAT_NEXT)(x,a,__VA_ARGS__)
#define CAT_NEXT(x,a,...) CAT_IND EMPTY()()(x##a,__VA_ARGS__)
#define CAT_END(x,a,...) #x

#define CAT(...) EVAL5(CAT_(,__VA_ARGS__,()))
CAT(a,b,c,d,e,f,g,h,i,j,k) // "abcdefghijk"

它使用宏递归来连接所有参数,直到到达人为附加的“()”参数。我选择“()”是因为它不可粘贴,并且易于检测。

由于默认情况下 MSVC 不实现符合标准的预处理器,因此您需要启用 /Zc:preprocessor 标志,以使上述代码在 MSVC 上运行。

编辑:

如果您不关心通用解决方案,这里有一个漂亮而紧凑的解决方案,最多包含 16 个参数:

#define CAT_(a,b,c,d,e,f,g,i,j,k,l,m,n,o,p,...) a##b##c##d##e##f##g##i##j##k##l##m##n##o##p
#define CAT(...) CAT_(__VA_ARGS__,,,,,,,,,,,,,,,,,)
#define STR(...) #__VA_ARGS__
#define STRe(...) STR(__VA_ARGS__)
STRe(CAT(1,2)) // "12"
STRe(CAT(1,2,3,4,5,6,7)) // "1234567"

关于c++ - 如何将可变参数宏的所有参数连接成带引号的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74723697/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com