【问题标题】:Make a C++ macro that acts like a stream制作一个像流一样的 C++ 宏
【发布时间】:2012-10-15 20:54:25
【问题描述】:

在没有 Google 帮助的情况下,我想知道是否有人可以告诉我是否可以创建一个 C++ (g++) 调试宏,它的作用类似于“改进的”std::cout。想法是通过

DBG << "Hello" << world;

可能会产生

myfile.cpp 1420 Hello world

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

【问题讨论】:

    标签: c++ c macros g++


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      怎么样:

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

      http://ideone.com/mN5n3

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

      【讨论】:

      • 不过,另一个想法是,是否可以在
      • @WesMiller 我不这么认为。至少使用这种语法似乎是不可能的。
      • 伤心。这一切都浮现在脑海,因为我是一个好孩子,不使用“使用 std”,这意味着我厌倦了输入 std::endl 等。感谢您的帮助!
      • 90% 我从@LuchianGrigore 那里偷走了。
      • @Luchian Grigore 如您所愿。不过,你还是做了繁重的工作!谢谢。罗布也这么说!
      【解决方案3】:

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

      #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) 将不起作用,但在调试模式下,你会收到一条消息到命令行。

      【讨论】:

      • 好吧,再想一想,你仍然是对的,但坚持原来问题的形式,它的 DBG
      • 唉,如果 x 中包含任何
      • 是的,我并不打算以这种方式使用它,真的。如果您想使用operator&lt;&lt;,我想其他答案会更适合您。您的特定错误是因为“hello”是一串字符,而不是实现operator&lt;&lt; 的对象。如果你打电话给MESSAGE("Hello" + "world"),它可能会起作用。
      • 我确实喜欢这个想法,尽管我想将 operator
      猜你喜欢
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多