有人知道任何 C99 预处理器魔法允许创建一个由另一个重复 N 次的字符串组成的字符串吗?
例如
STRREP( "%s ", 3 )
成为
"%s %s %s "
预处理后。
我自己唯一能想到的就是这样
#define STRREP( str, N ) STRREP_##N( str )
#define STRREP_0(str) ""
#define STRREP_1(str) str
#define STRREP_2(str) str str
#define STRREP_3(str) str str str
...
效果很好,但很难看,因为我必须手动为每个重复长度定义一个宏。我想将它与可变参数宏和返回显示的宏参数数量的宏一起使用 here .
最佳答案
既然它是一个宏,而且 N 无论如何都是一个数字常量,那么这个怎么样?
#include <stdio.h>
#define REP0(X)
#define REP1(X) X
#define REP2(X) REP1(X) X
#define REP3(X) REP2(X) X
#define REP4(X) REP3(X) X
#define REP5(X) REP4(X) X
#define REP6(X) REP5(X) X
#define REP7(X) REP6(X) X
#define REP8(X) REP7(X) X
#define REP9(X) REP8(X) X
#define REP10(X) REP9(X) X
#define REP(HUNDREDS,TENS,ONES,X) \
REP##HUNDREDS(REP10(REP10(X))) \
REP##TENS(REP10(X)) \
REP##ONES(X)
int main(void)
{
printf(REP(9,0,7, "*")); // "*" repeated 907 times
printf(REP(0,9,2, "#")); // "#" repeated 92 times
printf(REP(0,0,1, "@")); // "@" repeated 1 times
return 0;
}
关于用于返回重复一定次数的字符串的 C 预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8551418/