创建一个像流一样的C ++宏

时间:2012-10-15 20:54:25

标签: c++ c macros g++

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

DBG << "Hello" << world;

可能会产生

myfile.cpp 1420 Hello world

我知道有一些日志库(?)/宏(?)可以执行此类操作。我对它是如何完成感兴趣,而不是使用一些软件包。

3 个答案:

答案 0 :(得分:13)

您的宏可以创建一个临时变量,在销毁时调用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;
}

答案 1 :(得分:6)

怎么样:

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

http://ideone.com/mN5n3

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

答案 2 :(得分: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)将无效,但在调试模式下,您将收到命令行的消息。