用于返回重复一定次数的字符串的 C 预处理器宏

标签 c macros c-preprocessor

有人知道任何 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/

相关文章:

c++ - 如何在托管 dll 中重新初始化 native 代码

c++ - 同时声明和定义 C++ 数组

c - 为单元测试编写复杂的预处理器宏

在 C 中将宏转换为枚举类型

c - eBPF:理解验证器代码中的两个宏

c - 有了#define 值替换列表,如何将值解析为标识符的字符串?

c - 如何让Geany与C中的数学库链接?

c - 在 Beaglebone black 上运行 KissFFT 时出错

c++ - 在 x64 环境中编译代码时出现 LNK2001 错误。但是代码在x86环境下编译得很好

c++ - 三元运算符将类扩展宏应用于两个操作数