【发布时间】:2012-10-15 20:54:25
【问题描述】:
在没有 Google 帮助的情况下,我想知道是否有人可以告诉我是否可以创建一个 C++ (g++) 调试宏,它的作用类似于“改进的”std::cout。想法是通过
DBG << "Hello" << world;
可能会产生
myfile.cpp 1420 Hello world
我知道有一些日志库(?)/宏(?)可以做这种事情。我感兴趣的是它是如何完成的,而不是使用一些包。
【问题讨论】:
在没有 Google 帮助的情况下,我想知道是否有人可以告诉我是否可以创建一个 C++ (g++) 调试宏,它的作用类似于“改进的”std::cout。想法是通过
DBG << "Hello" << world;
可能会产生
myfile.cpp 1420 Hello world
我知道有一些日志库(?)/宏(?)可以做这种事情。我感兴趣的是它是如何完成的,而不是使用一些包。
【问题讨论】:
您的宏可以创建一个临时变量,该变量在销毁时调用endl。临时值将一直存在,直到封闭表达式结束,通常在 ;。
#include <iostream>
struct X {
~X() { std::cout << std::endl; }
};
#define DBG (X(), std::cout << __FILE__ << " " << __LINE__ << " ")
int main () {
std::string world(", world");
DBG << "Hello" << world;
}
【讨论】:
怎么样:
#define DBG std::cout << __FILE__ << " " << __LINE__ << " "
够近了!不幸的是,您必须事先声明变量world。
【讨论】:
调试宏背后的想法是,如果您处于发布模式,它应该编译为空。试试这个;
#ifdef _DEBUG
#define MESSAGE(x) (std::cout << __FILE__ << " " << __LINE__ << " " << x);
#else
#define MESSAGE(x) ;
#endif
int _tmain(int argc, _TCHAR* argv[])
{
MESSAGE("Hello");
return 0;
}
当你处于发布模式时,MESSAGE(x) 将不起作用,但在调试模式下,你会收到一条消息到命令行。
【讨论】:
operator<<,我想其他答案会更适合您。您的特定错误是因为“hello”是一串字符,而不是实现operator<< 的对象。如果你打电话给MESSAGE("Hello" + "world"),它可能会起作用。