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
慕工程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循环所取代。
繁花不似锦
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__
预处理器宏。
无论如何,正确使用时,宏非常有用。宏不是邪恶的 - 他们的滥用是邪恶的。
- 3 回答
- 0 关注
- 507 浏览
添加回答
举报
0/150
提交
取消