猿问

C ++宏什么时候有用?

C ++宏什么时候有用?

ç预处理器有理由担心和C ++社区避之唯恐不及。内联功能,功能和模板通常是更安全和更好的替代品#define

以下宏:

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

绝不是优于安全类型:

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

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

请将每个用例放在一个单独的答案中,以便可以进行投票,如果您知道如何在没有预备教授的情况下实现其中一个答案,请指出该答案的评论。


ibeautiful
浏览 508回答 3
3回答

烙印99

作为包装的调试功能,以自动传递之类的东西__FILE__,__LINE__等:#ifdef ( DEBUG )#define M_DebugLog( msg )&nbsp; std::cout << __FILE__ << ":" << __LINE__ << ": " << msg#else#define M_DebugLog( msg )#endif

慕工程0101907

方法必须始终是完整的,可编译的代码;&nbsp;宏可能是代码片段。因此,您可以定义一个foreach宏:#define&nbsp;foreach(list,&nbsp;index)&nbsp;for(index&nbsp;=&nbsp;0;&nbsp;index&nbsp;<&nbsp;list.size();&nbsp;index++)并因此使用它:foreach(cookies,&nbsp;i) &nbsp;&nbsp;&nbsp;&nbsp;printf("Cookie:&nbsp;%s",&nbsp;cookies[i]);从C ++ 11开始,它被基于范围的for循环所取代。

繁花不似锦

头文件保护需要宏。还有其他需要宏的领域吗?不多(如果有的话)。是否有其他情况可以从宏中受益?是!!!我使用宏的一个地方是非常重复的代码。例如,当包装C ++代码以与其他接口(.NET,COM,Python等)一起使用时,我需要捕获不同类型的异常。我是这样做的:#define&nbsp;HANDLE_EXCEPTIONS&nbsp;\catch&nbsp;(::mylib::exception&&nbsp;e)&nbsp;{&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;gcnew&nbsp;MyDotNetLib::Exception(e);&nbsp;\}&nbsp;\catch&nbsp;(::std::exception&&nbsp;e)&nbsp;{&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;gcnew&nbsp;MyDotNetLib::Exception(e,&nbsp;__LINE__,&nbsp;__FILE__);&nbsp;\}&nbsp;\catch&nbsp;(...)&nbsp;{&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;gcnew&nbsp;MyDotNetLib::UnknownException(__LINE__,&nbsp;__FILE__);&nbsp;\}我必须将这些捕获物放在每个包装函数中。我不是每次都输入完整的catch块,而是输入:void&nbsp;Foo(){ &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::mylib::Foo() &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;HANDLE_EXCEPTIONS}这也使维护更容易。如果我必须添加一个新的异常类型,我只需要添加一个地方。还有其他有用的示例:其中许多包括__FILE__和__LINE__预处理器宏。无论如何,正确使用时,宏非常有用。宏不是邪恶的 - 他们的滥用是邪恶的。
随时随地看视频慕课网APP
我要回答