【问题标题】:Error when defining a simple macro in c++在 C++ 中定义简单宏时出错
【发布时间】:2013-12-24 13:55:37
【问题描述】:

我不熟悉在 C++ 中使用宏。我写了一个简短的宏,我不知道它有什么问题。请帮忙。

#include <iostream>
using namespace std;

#define start B(
#define end )
#define B(x) cout<<x; 


int main (int argc, char *argv[])
{
    start 2014 end
}

【问题讨论】:

标签: c++ macros


【解决方案1】:

C 预处理器无法按您预期的方式工作。宏在一次传递中展开,这意味着预处理器会将“start”替换为“B(”,将“end”替换为“)”并将结果提供给编译器。

由于没有第二轮预处理,中间结果“B(2014)”不会被解释为预处理宏。相反,C++ 编译器会看到一个函数调用,这不是您想要的。

【讨论】:

  • 感谢您的解释。但是,如果它一次性完成,为什么会这样:#define start B #define end ; #define B(x) cout
  • @user3132631 start 将扩展为 B,识别为宏名称,然后再次扩展,在同一通道中。顺便说一下,end 在这里不是必需的,因为它将被扩展为一个多余的分号。
  • 好吧,这很有意义.. 有没有一个技巧可以避免使用括号,我可以像我想要的那样编​​写代码“start 2014 end”
  • @klem 根据您的尝试,您可以使用运算符重载:#define start std::cout &lt;&lt;#define end &lt;&lt;std::endl;。我能给你的最好建议是:不要尝试。尽量少用宏,因为它们是邪恶的parashift.com/c++-faq/preprocessor-is-evil.html
  • 当我称事情为邪恶时,我的电气工程师老板对我皱眉:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多