我希望能够创建一个调用其他宏的宏。我要调用的宏是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_filtersfitler_10_set_2_filters。有没有一种方法可以将提供给CreateBenchmark宏的值 segmentation 为传递给BENCHMARKBENCHMARK_RELATIVE调用的值?

另外,我的CreateBenchmark宏可以使用for循环来创建所有XX_filters,以便对CreateBenchmark的一次调用生成20个宏调用(对于_vector_来说是10个,对于_set_来说是10个)?

最佳答案

您忘记了结尾的串联运算符##:

#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/

10-11 23:05
查看更多