2011-10-14 119 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提供的变量名。