C++:将控制台输出存储在宏中更好吗
C++: Is it better to store a console output in a macro?
我刚开始学习C++的一些基础知识,但我已经意识到了两件事:
- 宏和函数之间的区别在于,宏是经过预处理的,而函数是经过编译的
- 在我读过的每一段代码中(还有一些已经定义了宏(,从来没有人为控制台输出定义过宏
现在我的问题是,你应该做这样的事情吗?
无宏:
//...
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++中常见的模式,因此由于运算符重载,您应该开始在解释运算符时更加灵活
我正在使用宏进行输出。与常规输出相比,它具有一定的优势,即:
- 您可以在宏定义的一个位置更改最近的所有输出。例如,如果要在所有输出前加上时间戳,则使用宏时只需要更改一次宏
- 您可以引入输出级别,如
DEBUG
、INFO
或ERROR.
。根据给定的输出级别(例如ERROR
(,您的匹配输出将被编译(例如ERROR
和FATAL_ERROR
(并执行,所有其他不相关的输出(如DEBUG
(甚至不会被编译,也不会包含在二进制代码中。此外,许多IDE甚至会使不相关的代码行变灰 - 您还可以在宏中引入可变数量的输入参数、代码行号、编译日期和时间等。甚至使用互斥来进行多线程输出,因为
cout << "first" << "second";
不是线程安全的(另一个线程可以在"first"
和"second"
字符串之间输出一些内容( - 等等。互联网上有很多关于这个话题的文章
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- 存储结构的更好方法
- 在QT列表中存储DB的查询结果的更好方法
- 在这种情况下,将数据存储在诸如SQLite之类的数据库中,还是存储在平面文本文件中更好
- 将继承的类存储到文件的更好方法
- 更好的是:存储对象与存储指针
- 我们是否应该将指向类实例的智能指针存储在大型 std::vector 中以获得更好的性能?
- 有没有更好的方法来删除对存储在 vector 中的元素的原始指针引用
- 使用这种格式在 c++ 中存储数据的更好方法
- 用于存储地址的单列列表的数据结构,更好地在C++中查找O(1)
- 对象的存储类型,选择什么更好
- 使用char还是unsigned char数组存储原始数据更好?
- 更好的存储大型相似对象的方法
- 哪个是更好的方法 - 将"常量引用"与"boost::<Class>shared_ptr"存储为成员变量
- 更好的数据存储和传递解决方案
- 将矩阵信息存储在STL矢量中.哪个是更好的矢量,哪个是矢量中的矢量
- 有没有比编写存储对有状态分配器对象的引用的包装器分配器更好的方法
- 为文字处理器存储文本的更好方法是什么?