我希望能够创建一个调用其他宏的宏。我想调用的宏是来自 folly 的 Benchmark
宏.
最终,我想要一堆看起来像这样的宏:
BENCHMARK(filter_10_vector_1_filter, n) { ... }
BENCHMARK(filter_10_set_1_filter, n) { ... }
BENCHMARK(filter_10_vector_2_filter, n) { ... }
BENCHMARK(filter_10_set_2_filter, n) { ... }
BENCHMARK(filter_10_vector_3_filter, n) { ... }
BENCHMARK(filter_10_set_3_filter, n) { ... }
... all the way to 10_filter
BENCHMARK(filter_100_vector_1_filter, n) { ... }
BENCHMARK(filter_100_set_1_filter, n) { ... }
... all the way to 10_filter
我尝试创建一个如下所示的宏:
#define CreateBenchmark(numElements, numFilters) \
BENCHMARK(filter_##numElements_vector_##numFilters_filters, n) { ... } \
BENCHMARK_RELATIVE(filter_##numElements_set_##numFilters_filters, n) { ... }
CreateBenchmark(10, 2);
这有望将我需要编写的宏数量减半。但是,##numElements
和 ##numFilters
替换并没有像我希望的那样发生。 CreateBenchmark(10, 2)
调用的结果是
============================================================================
FilterWithSetBenchmark.cpp relative time/iter iters/s
============================================================================
filter_numElements_vector_numFilters_filters 264.35us 3.78K
filter_numElements_set_numFilters_filters 99.93% 264.54us 3.78K
============================================================================
我期待着 filter_10_vector_2_filters
和 fitler_10_set_2_filters
。有没有办法将提供给 CreateBenchmark
宏的值分成传递给 BENCHMARK
和 BENCHMARK_RELATIVE
调用的值?
作为奖励,我的 CreateBenchmark
宏是否可以使用 for 循环来创建所有 XX_filters
,以便一次调用 CreateBenchmark
生成 20宏调用(10 个用于 _vector_
,10 个用于 _set_
)?
最佳答案
您忘记了尾部连接运算符 ##
:
#define CreateBenchmark(numElements, numFilters) \
BENCHMARK(filter_ ## numElements ## _vector_ ## numFilters ## _filters, n) { ... } \
BENCHMARK_RELATIVE(filter_ ## numElements ## _set_ ## numFilters ## _filters, n) { ... }
将 ##
视为字符串连接运算符,就像 Java 或 Python 中的 +
一样。
关于c++ - 如何在调用另一个宏时使用宏参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35350698/