1

我一直在编写用 C++ 编写的 ns3 网络模拟器。有很多函数可以有条件地记录输出,具体取决于系统的配置方式。(即记录消息的语句始终存在,但如果我关闭调试,则某些消息将不会出现)。

调用这些函数之一可能如下所示:

int n=42;  
NS_LOG_LOGIC("the answer is " << n);

这非常有用,因为它允许我直接将许多不同类型的数据连接到一个要记录的字符串中。

现在,我正在尝试编写自己的日志记录功能,以允许我更好地控制记录消息的位置,并允许我在每条消息之前插入唯一的 id 和时间戳,以便我知道它的来源和时间。

我的问题是——如何在 c++ 中创建一个可以以这种方式调用的函数?我找不到所示函数的来源,也没有看到任何其他类似函数的示例。

注意 - 常规的“+”连接不够好,因为我希望能够轻松连接一堆不同的数据类型。我知道还有其他方法可以做到这一点,但我也只是想弄清楚上面的函数中发生了什么!

谢谢 :)

4

2 回答 2

1

这是一种方法。DEBUG如果已定义,它将把表达式打印到标准输出。它假设#include <iostream>.

#ifdef DEBUG
#  define NS_LOG_LOGIC( expr ) \
      std::cout << expr << std::endl;  // or "\n" instead of endl if performance matters more than reliability
#else
#  define NS_LOG_LOGIC( expr )
#endif

编辑

正如托尼正确指出的那样:

  • std::endl将打印一个新行刷新您的缓冲区,它会更慢,但您可以获得更多保证您的日志已被写入以防崩溃。\n只是打印一个新行,缓冲区不会被刷新。
  • 使用do { ... } while(false)符号有助于宏观可靠性。
于 2012-03-12T05:34:41.277 回答
0

一个简单的 stringbuilder 类在这些类型的连接场景中会很有帮助——即使在更一般的情况下,您需要将最终的字符串作为参数或其他东西传递(即,不仅仅是记录它)。

有关示例实现,请参见例如:https ://stackoverflow.com/a/5770312/19254

于 2012-03-12T06:49:21.057 回答