c - 重复完全相同的代码段 1000 次而不循环

标签 c c-preprocessor preprocessor

出于某种原因(与性能测量相关),我需要重复代码段 1000 次(1024 次也可以),但没有“for”或任何其他循环。

显然,我很可能编写一个如下所示的宏:

#define RUN_1000_TIMES(x)   \
x                           \
x                           \
x                           \
...
...  /* (999+1 times the same line) */
...
x                           \
x

...然后将该宏应用到我的代码段。

但是还有比 1000 行长宏更优雅的解决方案吗?

最佳答案

#define RUN_1024_TIMES(x) do {RUN_512_TIMES(x); RUN_512_TIMES(x); } while(0)
#define RUN_512_TIMES(x) do {RUN_256_TIMES(x); RUN_256_TIMES(x); } while(0)
#define RUN_256_TIMES(x) do {RUN_128_TIMES(x); RUN_128_TIMES(x); } while(0)
#define RUN_128_TIMES(x) do {RUN_64_TIMES(x); RUN_64_TIMES(x); } while(0)
#define RUN_64_TIMES(x) do {RUN_32_TIMES(x); RUN_32_TIMES(x); } while(0)
#define RUN_32_TIMES(x) do {RUN_16_TIMES(x); RUN_16_TIMES(x); } while(0)
#define RUN_16_TIMES(x) do {RUN_8_TIMES(x); RUN_8_TIMES(x); } while(0)
#define RUN_8_TIMES(x) do {RUN_4_TIMES(x); RUN_4_TIMES(x); } while(0)
#define RUN_4_TIMES(x) do {RUN_2_TIMES(x); RUN_2_TIMES(x); } while(0)
#define RUN_2_TIMES(x) do {x; x; } while(0)

do{ ... } while(0)仅适用于您使用 if (....) RUN_1024_TIMES(...); 调用它的情况。不需要时可以将其删除。

您也可以对每个宏执行 3 次:

#define RUN_1000_TIMES(x) do {RUN_729_TIMES(x); RUN_243_TIMES(x); RUN_27_TIMES(x); x; } while(0)
#define RUN_729_TIMES(x) do {RUN_243_TIMES(x); RUN_243_TIMES(x); RUN_243_TIMES(x); } while(0)
#define RUN_243_TIMES(x) do {RUN_81_TIMES(x); RUN_81_TIMES(x); RUN_81_TIMES(x); } while(0)
#define RUN_81_TIMES(x) do {RUN_27_TIMES(x); RUN_27_TIMES(x); RUN_27_TIMES(x); } while(0)
#define RUN_27_TIMES(x) do {RUN_9_TIMES(x); RUN_9_TIMES(x); RUN_9_TIMES(x); } while(0)
#define RUN_9_TIMES(x) do {RUN_3_TIMES(x); RUN_3_TIMES(x); RUN_3_TIMES(x); } while(0)
#define RUN_3_TIMES(x) do {x; x; x; } while(0)

关于c - 重复完全相同的代码段 1000 次而不循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55925305/

相关文章:

c - 预处理器 #if 数组

c - Flex 词法分析器 : remember starting position

c++ - Qt - 使用预处理器指令检查 Windows 上链接的 .lib 的可用性

c++ - 如何解决 "must specify at least one argument for ' .. .' parameter of variadic macro"

c++ - if-指令宏比较

c - 确保只将指针传递给可变参数函数

compilation - 如何检测 F# 程序是在 Mono 上编译的?

C程序: Input conditon expression through file

c - 编译文件(汇编文件)中的头文件信息在哪里?

c - 如何获取已安装文件系统的列表