多行预处理器宏

新手上路,请多包涵

如何制作多行预处理器宏?我知道如何制作一行:

 #define sqr(X) (X*X)

但我需要这样的东西:

 #define someMacro(X)
    class X : public otherClass
    {
         int foo;
         void doFoo();
    };

我怎样才能让它工作?

这只是一个例子,真正的宏可能很长。

原文由 noisy cat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 728
2 个回答

您使用 \ 作为行继续转义字符。

 #define swap(a, b) {               \
                       (a) ^= (b); \
                       (b) ^= (a); \
                       (a) ^= (b); \
                   }

编辑:正如@abelenky 在评论中指出的那样, \ 字符 必须是该行的最后一个字符。如果不是(即使之后只是空白),您将在其后的每一行上收到令人困惑的错误消息。

原文由 Ed S. 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是 2021 年,我们真的应该朝着 inline 。不正确、不必要和过度使用宏会使代码膨胀,而且它们很难调试(阅读起来很难调试)

 inline void foo(x)
{
   // do whatever with x
}

但是,如果确实需要宏,请用 do { } while(0); 围绕它们,原因在这篇文章中解释了 为什么在宏中使用显然毫无意义的 do-while 和 if-else 语句?

原文由 asio_guy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题