我希望能够创建一个宏,它调用其他宏。我想调用的宏是来自愚昧的愚昧宏。
最后,我希望有一堆宏看起来像:
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_)?
发布于 2016-02-11 21:56:44
您忘记了尾随连接操作符##。
#define CreateBenchmark(numElements, numFilters) \
BENCHMARK(filter_ ## numElements ## _vector_ ## numFilters ## _filters, n) { ... } \
BENCHMARK_RELATIVE(filter_ ## numElements ## _set_ ## numFilters ## _filters, n) { ... }将##看作字符串连接操作符,就像+中的Java那样。
发布于 2016-02-11 21:54:27
是偶然发现的。我的create宏函数需要更多的#。这是一个新的:
#define CreateBenchmark(numElements, numFilters) \
BENCHMARK(filter_##numElements##_vector_##numFilters##_filters, n) { ... } \
BENCHMARK_RELATIVE(filter_##numElements##_set_##numFilters##_filters, n) { ... }基本上,我想要的子床需要完全封装在双#中。从##numElements到##numElements##。同样适用于numFilters。
发布于 2016-02-11 21:48:28
您可以使用__VA_ARGS__来表示宏参数。
https://stackoverflow.com/questions/35350698
复制相似问题