如何在调用另一个宏时使用宏参数?

Pay*_*ian 5 c++ macros

我希望能够创建一个调用其他宏的宏。我想调用的Benchmark宏是来自folly的宏。

最终,我想要一堆看起来像的宏:

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
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个如下所示的宏:

#define CreateBenchmark(numElements, numFilters) \
  BENCHMARK(filter_##numElements_vector_##numFilters_filters, n) { ... } \
  BENCHMARK_RELATIVE(filter_##numElements_set_##numFilters_filters, n) { ... }

CreateBenchmark(10, 2);
Run Code Online (Sandbox Code Playgroud)

这有望将我需要编写的宏数量减半。但是,##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
============================================================================
Run Code Online (Sandbox Code Playgroud)

我期待filter_10_vector_2_filtersfitler_10_set_2_filters。有没有办法将提供给CreateBenchmark宏的值细分为传递给BENCHMARKandBENCHMARK_RELATIVE调用的值?

作为奖励,我的CreateBenchmark宏是否可以使用 for 循环来创建所有这些,XX_filters以便一次调用CreateBenchmark生成 20 个宏调用(10 个 for_vector_和 10 个 for _set_)?

Mad*_*ist 4

您忘记了尾随连接运算符##

#define CreateBenchmark(numElements, numFilters) \
  BENCHMARK(filter_ ## numElements ## _vector_ ## numFilters ## _filters, n) { ... } \
  BENCHMARK_RELATIVE(filter_ ## numElements ## _set_ ## numFilters ## _filters, n) { ... }
Run Code Online (Sandbox Code Playgroud)

就像Java 或 Python 中的##字符串连接运算符一样+