2011-10-14 65 views
6

我試圖在調試(日誌記錄)時使用宏顯示成員值的變量名稱向控制檯輸出。 如何做到這一點?我嘗試了以下,但它不起作用。在#define中打印變量名稱

#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl; 

int main(){ 
    int my_variable=3; 
    MY_PRINT(my_variable); 
    // I would like to print to console 
    // 'my_variable'=3 
} 
+2

定義「它不起作用」。我不得不在過去多次對你說,這是一個恥辱。 –

+0

嗨Tomalek,請參閱下面的回覆。添加'#'字符就足夠了 –

+2

是的,我也知道答案是什麼。但我正在努力培養你一點時間,寫出適當的問題。 –

回答

17

奧赫...我找到了解決方案。

我應該寫這樣

#define MY_PRINT(x) std::cout << #x"=" << x << std::endl 
2

對於C宏++我用這個:

#define STR(x) #x << '=' << x 

int main() 
{ 
    int i = 1; 
    std::string str("hello"); 
    std::vector<std::string> vec; 
    my_class mc; 

    ... 

    std::cout << STR(i) << std::endl 
      << STR(str) << std::endl 
      << STR(vec) << std::endl 
      << STR(mc) << std::endl; 

    return 0; 
} 

這樣的編譯器選擇基於數據類型的流媒體運營商,所以你不需要打擾每個不同的宏,它可以去任何std :: ostream,而不僅僅是std :: cout。只要爲您的數據提供適當的流媒體運營商:

std::ostream operator<<(std::ostream&, const T&); 
std::ostream operator<<(std::ostream&, const std::vector<T>&); 
etc 

但我希望有一個模板的方式來代替宏觀,或者至少由#X提供的變量名。