在阅读了有关宏使用的另一个问题之后,我想知道:它们有什么用?

我看不到很快会被任何其他语言构造所取代的一件事,就是减少了您需要在以下内容中键入的相关单词的数量:

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的requireinclude功能(#pragma once)(SadSido,Catalin)
  • 通过替换复杂的代码(例如MESSAGEMAPBOOST_FOREACH)(SadSido,fnieto)来增强
  • 的可读性
  • DRY原理(Jason S)
  • 内联替换(Matthias Wandel,Robert S. Barnes)
  • 串化(Jason S)
  • 最佳答案

  • 在不同条件下编译不同的代码(#ifdef __DEBUG__);
  • 会为每个翻译单元(#pragma once)包含一次每个 header ;
  • __FILE____LINE__-替换为当前文件名和当前行;
  • 构造代码以使其更具可读性(例如:BEGIN_MESSAGE_MAP());

  • 请在以下网址查看有趣的宏讨论:

    http://www.gotw.ca/gotw/032.htm

    http://www.gotw.ca/gotw/077.htm

    关于c++ - 预处理程序宏有什么用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1265951/

    10-09 23:14