For C++ I use this:
#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;
}
This way the compiler chooses the streaming operator based on the data type, so you don't need to bother with different macros for each, and it can go to any std::ostream, not just std::cout. Just provide the appropriate streaming operator for your data:
std::ostream operator<<(std::ostream&, const T&);
std::ostream operator<<(std::ostream&, const std::vector<T>&);
etc
But I wish there was a template way to replace the macro, or at least the variable name provided by the #x.