2015-03-25 26 views
3

我想:一般地打印變量序列與他們的名字

int a = 2; 
int b = 3; 
// ... 

PRINT1(a, b, ...); 
PRINT2(a, b, ...); 

其中PRINT1應擴展爲:

std::cout << "a = " << a << ", b = " << b << ... << std::endl; 
// note: in "a = ...", "a" is the name of the variable, i.e.: 
// PRINT(bar, ...) should print "bar = ..." 

PRINT2應擴大到(使用cppformat):

fmt::print("a = {}, b = {}, ...", a, b, ...); 

現在我正在使用Boost.PP並且必須寫入PRINT((a)(b)(c)...)來實現類似於第一種場景的東西,但是如果我可以使用逗號代替它會更好。其中一個問題的解決方案可能很容易適用於解決這兩個問題。

+0

因此,您基本上需要一個函數,該函數會接收未定義類型的變量的未定義數量,並使其打印出變量的內容以及它們的標識符名稱? 你能詳細說一下爲什麼?這聽起來像任何人都不應該真的想做的事。 – Mercious 2015-03-25 11:56:52

+2

@Mercious debug_print(foo,bar,baz,a,b,c);將打印到任何你已經配置了每個變量的名稱和值的地方。調試時非常有用,尤其是在調試優化版本時,無需調試信息即可構建,分佈式系統無法在每個進程中打開調試器會話(考慮10ks進程),......當然,您可以每次都寫出整個系列,但你爲什麼要?預處理器知道變量(#)的名稱,並且編譯器知道它的值。 – gnzlbg 2015-03-26 17:52:02

回答

0

這是我的解決方案。不是很動態的,你要知道你要提前多少個參數有:

// Using macros: 

#define PRINT1_1(A) std::cout << "a = " << A << std::endl; 
#define PRINT1_2(A,B) std::cout << "a = " << A << ", b = " << B << std::endl; 

#define PRINT2_1(A) fmt::print("a = {}", A); 
#define PRINT2_2(A,B) fmt::print("a = {}, b = {}", A, B); 

// Using `va_arg`: 

#include <iostream> 
#include <cstdarg> 

void PRINT1(int argc, ...) 
{ 
    va_list args; 
    va_start(args, argc); 
    char vc = 'a'; 
    int val = argc; 
    for (int i = 0; i < argc; ++i, ++vc) { 
     std::cout << vc << " = " << va_arg(args, int); 
     if (i < argc - 1) 
      std::cout << ", "; 
    } 
    va_end(args); 
    std::cout << std::endl; 
} 

// similarly implement PRINT2 

int main() 
{ 
    PRINT1_2(1,2); 

    // first argument specifies the number 
    // of the remaining arguments: 
    PRINT1(3, 1,2,4); 
    return 0; 
} 

輸出:

a = 1, b = 2 
a = 1, b = 2, c = 4 
+0

a和b是變量的名稱,PRINT1(foo,bar,baz)應該打印「foo = ...,bar = ...,baz = ...」。我在這個問題上加了一句話來強調這一點。 – gnzlbg 2015-03-26 17:49:15

+0

@gnzlbg堆棧溢出不是'我的代碼'網站,它不能以特定於您的程序的方式提供代碼。您可以更改變量名稱。 – cybermonkey 2015-03-26 17:52:46

+0

@ʎǝʞuoɯɹǝqʎɔ1)這是一個普遍存在的問題。 2)我已經有了解決這個問題的方法,使用Boost.PP(我要求更好,不同的問題沒有提到這個問題)。我不知道你的意思是「你可以改變變量名稱」,svlasov沒有理解我提出的問題,這很好,我想這是我的錯。我試圖通過添加註釋來改善問題。但請注意,標題中顯示「通常用它們的名稱(即每個變量的相應名稱)打印一系列變量(即它們的值)。 – gnzlbg 2015-03-26 20:21:02

1

您可以使用BOOST_PP_TUPLE_TO_SEQ將其轉換爲一個序列,像這樣:

#define PRINT_ARGS(...) PRINT(BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__)))