2016-02-11 56 views
4

我希望能夠創建一個調用其他宏的宏。我想要調用的宏是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_)的?

+1

感謝您展示可能是我見過的'##'的第一個合理使用。你有沒有使用三字母符號? –

+0

沒問題,我猜? :p通常情況下你會看到'##'在哪些情況下使用?不,我不使用trigraphs,只是寫一些常規的基準測試代碼。 –

+0

我不認爲我看過'##'以外的完全人爲的例子。這就是我想到三字母的原因。 –

回答

4

你忘了尾隨連接符##

#define CreateBenchmark(numElements, numFilters) \ 
    BENCHMARK(filter_ ## numElements ## _vector_ ## numFilters ## _filters, n) { ... } \ 
    BENCHMARK_RELATIVE(filter_ ## numElements ## _set_ ## numFilters ## _filters, n) { ... } 

##作爲字符串連接運算符,就像在Java或Python +思考。

-2

您可以使用__VA_ARGS__來表示宏參數。

+2

這將如何遠程適用於OP的情況? –

1

偶然發現它。我的創建宏功能需要更多#。下面是新的:

#define CreateBenchmark(numElements, numFilters) \ 
    BENCHMARK(filter_##numElements##_vector_##numFilters##_filters, n) { ... } \ 
    BENCHMARK_RELATIVE(filter_##numElements##_set_##numFilters##_filters, n) { ... } 

基本上,我想SUBBED需要被完全封閉在雙#什麼。從##numElements轉到##numElements##。同樣爲numFilters