6

在没有谷歌帮助的情况下,我想知道是否有人可以告诉我是否可以创建一个 C++ (g++) 调试宏,例如,一个“改进的”std::cout。想法是通过 << 接受 args 并附加一些文本,以便

DBG << "Hello" << world;

可能会产生

myfile.cpp 1420 Hello world

我知道那里有做这种事情的日志库(?)/宏(?)。我对它是如何完成的感兴趣,而不是使用一些包。

4

3 回答 3

17

您的宏可以创建一个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;
}
于 2012-10-15T21:09:42.790 回答
6

怎么样:

#define DBG std::cout << __FILE__ << " " << __LINE__ << " "

http://ideone.com/mN5n3

足够接近!不幸的是,您必须world事先声明变量。

于 2012-10-15T20:55:39.313 回答
1

调试宏背后的想法是,如果您处于发布模式,它应该编译为空。尝试这个;

#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)不会有任何影响,但在调试模式下,你会收到一条消息到命令行。

于 2012-10-15T21:10:05.440 回答