在阅读了另一个有关宏使用的问题后,我想知道:什么are他们有什么好处?
我认为不会很快被任何其他语言结构取代的一件事是减少您需要输入以下内容的相关单词的数量:
void log_type( const bool value ) { std::cout << "bool: " << value; }
void log_type( const int value ) { std::cout << "int: " << value; }
...
void log_type( const char value ) { std::cout << "char: " << value; }
void log_type( const double value ) { std::cout << "int: " << value; }
void log_type( const float value ) { std::cout << "float: " << value; }
相对于
#define LOGFN( T ) void log_type( const T value ) { std::cout << #T ## ": " << value; }
LOGFN( int )
LOGFN( bool )
...
LOGFN( char )
LOGFN( double )
LOGFN( float )
还有其他“不可替代”吗?
编辑:
试图总结答案中遇到的原因-为什么;因为这就是我感兴趣的。主要是因为我有一种感觉,其中大多数是由于我们仍然在支持很差的环境中使用原始文本文件进行编程。
- 待编译代码的灵活性(例如
#ifdef DEBUG
、平台问题)(SadSido、Catalin、Goz)
- 调试目的(例如
__LINE__, __TIME__
);我还将“字符串化”放在这个原因下(SadSido,Jla3ep,Jason S)
- 替换例如PHP 的
require
vs. include
特征 (#pragma once
)(萨德西多,卡塔林)
- 通过替换复杂的代码(例如
MESSAGEMAP
, BOOST_FOREACH
)(SadSido,fnieto)
- DRY 原则 (Jason S)
- 内联替代品(Matthias Wandel、Robert S. Barnes)
- 字符串化 (Jason S)
- 在不同条件下编译不同的代码(
#ifdef __DEBUG__
);
- 保护每个翻译单元包含每个标头一次(
#pragma once
);
-
__FILE__
and __LINE__
- 替换为当前文件名和当前行;
- 构建代码以使其更具可读性(例如:
BEGIN_MESSAGE_MAP()
);
请参阅此处的 gotw 中有趣的宏讨论:
http://www.gotw.ca/gotw/032.htm http://www.gotw.ca/gotw/032.htm
http://www.gotw.ca/gotw/077.htm http://www.gotw.ca/gotw/077.htm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)