C 宏什么时候有用?

新手上路,请多包涵

C 预处理器有理由被 C++ 社区恐惧和回避。内联函数、常量和模板通常是 #define 的更安全和优越的替代品。

以下宏:

 #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)

绝不优于安全类型:

 inline bool succeeded(int hr) { return hr >= 0; }

但是宏确实有它们的位置,请列出您发现的宏的用途,如果没有预处理器 就无法 做到。

请将每个用例放在一个单独的答案中,以便对其进行投票,并且如果您知道如何在没有预处理者的情况下获得其中一个答案,请在该答案的评论中指出如何。

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

阅读 818
2 个回答

作为调试功能的包装器,自动传递 __FILE____LINE__ 等内容:

 #ifdef ( DEBUG )
#define M_DebugLog( msg )  std::cout << __FILE__ << ":" << __LINE__ << ": " << msg
#else
#define M_DebugLog( msg )
#endif

由于 C++20 魔法类型 std::source_location 可以用来代替 __LINE____FILE__ 来实现一个模拟作为普通函数(模板)。

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

宏对于模拟 switch 语句的语法很有用:

 switch(x) {
case val1: do_stuff(); break;
case val2: do_other_stuff();
case val3: yet_more_stuff();
default:   something_else();
}

对于非整数值类型。在这个问题中:

在 switch 语句中使用字符串——我们在 C++17 中的立场是什么?

你会发现答案暗示了一些涉及 lambdas 的方法,但不幸的是,它是让我们最接近的宏:

 SWITCH(x)
CASE val1  do_stuff(); break;
CASE val2  do_other_stuff();
CASE val3  yet_more_stuff();
DEFAULT    something_else();
END

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

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