[英]How to use macro arguments in call to another macro?
我希望能够创建一个调用其他宏的宏。 我想要调用的宏是来自愚蠢的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。
意外地弄清楚了。 我的创建宏函数需要更多#
。 这是新的:
#define CreateBenchmark(numElements, numFilters) \
BENCHMARK(filter_##numElements##_vector_##numFilters##_filters, n) { ... } \
BENCHMARK_RELATIVE(filter_##numElements##_set_##numFilters##_filters, n) { ... }
基本上,我想要的subbed需要完全包含在double #
。 从##numElements
到##numElements##
。 同样适用于numFilters
。
您可以使用__VA_ARGS__
来表示宏参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.