簡體   English   中英

如何在調用另一個宏時使用宏參數?

[英]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_filtersfitler_10_set_2_filters 有沒有辦法將提供給CreateBenchmark宏的值轉換為傳遞給BENCHMARKBENCHMARK_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM