我一直在编写用c ++编写的ns3网络模拟器。根据系统的配置方式,有许多函数可以有条件地记录输出。 (即记录消息的语句总是在那里但是如果我关闭调试那么一些消息就不会出来了。)
调用其中一个函数可能如下所示:
int n=42;
NS_LOG_LOGIC("the answer is " << n);
这非常有用,因为它允许我将许多不同类型的数据直接连接成一个要记录的字符串。
现在我正在尝试编写自己的日志记录功能,以便我可以更好地控制记录消息的位置,并允许我在每条消息之前插入唯一的ID和时间戳,以便我知道它来自何处和何时。
我的问题是 - 如何在c ++中创建一个可以这种方式调用的函数?我找不到所显示函数的来源,也没有看到任何其他类似函数的例子。
注意 - 常规的'+'连接不够好,因为我希望能够轻松地连接一堆不同的数据类型。我知道还有其他方法可以做到这一点,但我也只是想弄清楚上面函数中发生了什么!
谢谢:)
答案 0 :(得分: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
Tony正确指出:
std::endl
会打印一个新行并刷新缓冲区,但速度会慢一点,但您可以更好地保证在发生崩溃时已写入日志。 \n
只是打印一个新行,缓冲区没有刷新。do { ... } while(false)
表示法有助于宏的可靠性。答案 1 :(得分:0)
一个简单的stringbuilder类在这些类型的串联场景中可能会有所帮助 - 即使在更常见的情况下,您需要将最终字符串作为参数或其他东西传递(即,不只是记录它)。
有关示例实现,请参阅例如:https://stackoverflow.com/a/5770312/19254