我希望能夠創建一個調用其他宏的宏。我想要調用的宏是folly的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_
)的?
感謝您展示可能是我見過的'##'的第一個合理使用。你有沒有使用三字母符號? –
沒問題,我猜? :p通常情況下你會看到'##'在哪些情況下使用?不,我不使用trigraphs,只是寫一些常規的基準測試代碼。 –
我不認爲我看過'##'以外的完全人爲的例子。這就是我想到三字母的原因。 –