c++ - C++ 如何用宏列印可變數目的參數?

  显示原文与译文双语对照的内容
105 3

我想定義一個具有可變參數的宏,它輸出每個給定參數的名稱和值。

舉個例子:

MACRO(x) 將列印 x = 123MACRO(x,y) 將列印 x,y = 123,666

更好的宏更易於閱讀

BETTER_MACRO(x,y) 會列印x = 123, y = 666

對於一個變數,我可以使用:

#define MACRO(...) cout <<#__VA_ARGS__ <<" =" <<__VA_ARGS__ <<endl;

更重要的是,它不工作。

通過這種方式,我想到一些輔助問題。

1 ) 如何獲取給定宏的變數數?2 ) 如何訪問每個參數?

然後我們希望用下面的方法來定義宏。

#define BETTER_MACRO(...) {for (int i=0;i<=nb_variables;i++) {cout <<#var[i] <<var[i];}}

时间:原作者:0个回答

64 0
#define MACRO(...) function(#__VA_ARGS__, __VA_ARGS__)
//base case for template recursion when one argument remains
template <typename Arg1>
void function(const char* name, Arg1&& arg1)
{
 std::cout <<name <<" =" <<arg1 <<std::endl;
}
//recursive variadic template for multiple arguments
template <typename Arg1, typename... Args>
void function(const char* names, Arg1&& arg1, Args&&... args)
{
 const char* comma = strchr(names + 1, ',');
 std::cout.write(names, comma - names) <<" =" <<arg1;
 function(comma, args...);
}

上面有一些有點奇怪的屬性,你在調用宏中包含的任何間距都將鏡像在輸出中。

原作者:
79 4

1 ) 如何獲取給定宏的變數數?

你可以使用類似這樣的元素來計算元素:( 硬編碼限制):

#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N,.. .) N
#define COUNT(...) COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
//Warning: COUNT() return 1 (as COUNT(A)) :-/

2 ) 如何訪問每個參數?

/* args */
#define ARG(N,.. .) ARG_##N(__VA_ARGS__)
#define ARG_1(a,.. .) a
#define ARG_2(a, b,...) b
#define ARG_3(a, b, c,.. .) c
#define ARG_4(a, b, c, d,.. .) d
#define ARG_5(a, b, c, d, e,.. .) e
#define ARG_6(a, b, c, d, e, f,.. .) f
#define ARG_7(a, b, c, d, e, f, g,.. .) g
#define ARG_8(a, b, c, d, e, f, g, h,.. .) h
原作者:
70 2

不是理想的解決方案,但:

宏本身可以接受固定數量的參數,但是每個參數都可以是帶括弧的列表( 儘管它只是一個文本字元串) 。

 void function_taking_varargs(...);
 #define SLIGHTLY_BETTER(x) 
 function_taking_varargs x
 SLIGHTLY_BETTER((a, b, c));
原作者:
52 0

這個工作在pre-C++11中,沒有醜陋的。它使用醜陋的MACROS,它至少給出編譯時錯誤。調用語法有點不同,但不是太多。我試圖尋找類似 SEQ_ENUM的東西,但是拿了一個宏,找不到任何東西。

首先,我們將製作定製的列印 MACROS:

#define PRINT_ONE(elem) BOOST_PP_STRINGIZE(elem)" =" <<elem
#define PRINT_ONE_COMMA(r, data, elem) BOOST_PP_STRINGIZE(elem)" =" <<elem <<"," <<

接下來,一些用於列印的實用程序:

#define LAST(seq) BOOST_PP_SEQ_ELEM(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), seq)
#define REST(seq) BOOST_PP_SEQ_SUBSEQ(seq, 0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)))

最後,我們可以迭代並列印:

#define PRINT(seq) std::cout <<BOOST_PP_SEQ_FOR_EACH(PRINT_ONE_COMMA, _, REST(seq)) PRINT_ONE(LAST(seq)) <<'n';

用法如下:

PRINT((var1)(var2)(var3))//var1 = 5, var2 = 3, var3 = 7

下面是一個 live示例。

原作者:
...