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

标签 c++ macros

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

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

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 宏的值分成传递给 BENCHMARKBENCHMARK_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/

相关文章:

C++ LibCurl 发送 HTTPS 请求

scala - 使用宏在 thunk 前面粘贴 import 语句

vim - 无法在vim中调用录制的宏

C++ 宏创建对象

macros - 如何将列表更改为 Clojure 宏中的代码?

c++ - boost ptree-如何使用迭代器修改 XML?

c++ - 为什么不将 .cpp 转换为 c 程序文件?

c++ - const auto std::initializer_list Clang 和 GCC 的区别

c++ - 用于指令的 If 语句

c - 为什么这个宏不像我想象的那样工作?