首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在调用另一个宏时使用宏参数?

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

Stack Overflow用户
提问于 2016-02-11 21:46:05
回答 3查看 1.1K关注 0票数 5

我希望能够创建一个宏,它调用其他宏。我想调用的宏是来自愚昧愚昧宏。

最后,我希望有一堆宏看起来像:

代码语言:javascript
复制
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

我尝试创建一个宏,其外观如下:

代码语言:javascript
复制
#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)调用的结果是

代码语言:javascript
复制
============================================================================
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_)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-11 21:56:44

您忘记了尾随连接操作符##

代码语言:javascript
复制
#define CreateBenchmark(numElements, numFilters) \
  BENCHMARK(filter_ ## numElements ## _vector_ ## numFilters ## _filters, n) { ... } \
  BENCHMARK_RELATIVE(filter_ ## numElements ## _set_ ## numFilters ## _filters, n) { ... }

##看作字符串连接操作符,就像+中的Java那样。

票数 4
EN

Stack Overflow用户

发布于 2016-02-11 21:54:27

是偶然发现的。我的create宏函数需要更多的#。这是一个新的:

代码语言:javascript
复制
#define CreateBenchmark(numElements, numFilters) \
  BENCHMARK(filter_##numElements##_vector_##numFilters##_filters, n) { ... } \
  BENCHMARK_RELATIVE(filter_##numElements##_set_##numFilters##_filters, n) { ... }

基本上,我想要的子床需要完全封装在双#中。从##numElements##numElements##。同样适用于numFilters

票数 1
EN

Stack Overflow用户

发布于 2016-02-11 21:48:28

您可以使用__VA_ARGS__来表示宏参数。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35350698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档