C++:将控制台输出存储在宏中更好吗

C++: Is it better to store a console output in a macro?

本文关键字:更好 存储 控制台 输出 C++      更新时间:2023-10-16

我刚开始学习C++的一些基础知识,但我已经意识到了两件事:

  1. 宏和函数之间的区别在于,宏是经过预处理的,而函数是经过编译的
  2. 在我读过的每一段代码中(还有一些已经定义了宏(,从来没有人为控制台输出定义过宏

现在我的问题是,你应该做这样的事情吗?

无宏:

//...
cout << "This is a test";
cout << "This is another test";
cout << "This is a third test" << " with two strings in one";
//..

带宏:

#define OUTP(x) (cout << x)
//...
OUTP("This is a test");
OUTP("This is another test");
OUTP("This is a third test" + " with two strings in one");
//...

首先,我看不出有什么大的区别,除了我对宏不太困惑之外,因为通常"<<"是位移,但这里它用于插入,而"OUTP("Test"("对我来说看起来更好,因为它的工作方式与正常方法类似。

但由于我从未见过有人使用它,这背后有原因吗?

"Better"是一个非常模糊的术语,它实际上取决于你想要实现什么。

每一个实施决策都有其优缺点,所以它实际上取决于单个项目。

据我所见,抽象宏背后的输出的好处可能是:

  • 在需要时,用更简单的方法交换输出方法,以支持更易于管理的日志记录结构
  • 较少打字
  • 如果宏负责添加一些常见的格式选项,则会更加统一

缺点可能是:

  • 您将失去灵活性,因为不可避免地,宏将不允许一些直接使用cout本来允许的操作
  • 您添加了一层间接性,并脱离了该语言的常见实践。有语言经验的人会更快地掌握cout,否则他们将不得不寻找宏的内容并习惯它

肯定还有其他理由支持或反对这样的选择,但最终我认为没有正确的选择。

p.S.

与宏混淆,因为通常"<<"是位偏移,但这里它用于插入,

虽然这肯定是一个很好的理由,但我建议你从另一方面来看。输出的"位移"运算符是C++中常见的模式,因此由于运算符重载,您应该开始在解释运算符时更加灵活

我正在使用宏进行输出。与常规输出相比,它具有一定的优势,即:

  1. 您可以在宏定义的一个位置更改最近的所有输出。例如,如果要在所有输出前加上时间戳,则使用宏时只需要更改一次宏
  2. 您可以引入输出级别,如DEBUGINFOERROR.。根据给定的输出级别(例如ERROR(,您的匹配输出将被编译(例如ERRORFATAL_ERROR(并执行,所有其他不相关的输出(如DEBUG(甚至不会被编译,也不会包含在二进制代码中。此外,许多IDE甚至会使不相关的代码行变灰
  3. 您还可以在宏中引入可变数量的输入参数、代码行号、编译日期和时间等。甚至使用互斥来进行多线程输出,因为cout << "first" << "second";不是线程安全的(另一个线程可以在"first""second"字符串之间输出一些内容(
  4. 等等。互联网上有很多关于这个话题的文章