为了账号安全,请及时绑定邮箱和手机立即绑定

C ++宏什么时候有用?

C ++宏什么时候有用?

C++
ibeautiful 2019-08-15 14:55:34
C ++宏什么时候有用?该ç预处理器有理由担心和C ++社区避之唯恐不及。内联功能,功能和模板通常是更安全和更好的替代品#define。以下宏:#define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)绝不是优于安全类型:inline bool succeeded(int hr) { return hr >= 0; }但宏确实有它们的位置,请列出您为宏找到的用途,如果没有预处理器,您就无法做到。请将每个用例放在一个单独的答案中,以便可以进行投票,如果您知道如何在没有预备教授的情况下实现其中一个答案,请指出该答案的评论。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

作为包装的调试功能,以自动传递之类的东西__FILE__,__LINE__等:


#ifdef ( DEBUG )

#define M_DebugLog( msg )  std::cout << __FILE__ << ":" << __LINE__ << ": " << msg

#else

#define M_DebugLog( msg )

#endif


查看完整回答
反对 回复 2019-08-15
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

方法必须始终是完整的,可编译的代码; 宏可能是代码片段。因此,您可以定义一个foreach宏:

#define foreach(list, index) for(index = 0; index < list.size(); index++)

并因此使用它:

foreach(cookies, i)
    printf("Cookie: %s", cookies[i]);

从C ++ 11开始,它被基于范围的for循环所取代。


查看完整回答
反对 回复 2019-08-15
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

头文件保护需要宏。

还有其他需要宏的领域吗?不多(如果有的话)。

是否有其他情况可以从宏中受益?是!!!

我使用宏的一个地方是非常重复的代码。例如,当包装C ++代码以与其他接口(.NET,COM,Python等)一起使用时,我需要捕获不同类型的异常。我是这样做的:

#define HANDLE_EXCEPTIONS \catch (::mylib::exception& e) { \    throw gcnew MyDotNetLib::Exception(e); \} \catch (::std::exception& e) { \    throw gcnew MyDotNetLib::Exception(e, __LINE__, __FILE__); \} \catch (...) { \    throw gcnew MyDotNetLib::UnknownException(__LINE__, __FILE__); \}

我必须将这些捕获物放在每个包装函数中。我不是每次都输入完整的catch块,而是输入:

void Foo(){
    try {
        ::mylib::Foo()
    }
    HANDLE_EXCEPTIONS}

这也使维护更容易。如果我必须添加一个新的异常类型,我只需要添加一个地方。

还有其他有用的示例:其中许多包括__FILE____LINE__预处理器宏。

无论如何,正确使用时,宏非常有用。宏不是邪恶的 - 他们的滥用是邪恶的。


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 507 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信