3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
作為包裝的調(diào)試功能,以自動(dòng)傳遞之類的東西__FILE__,__LINE__等:
#ifdef ( DEBUG )
#define M_DebugLog( msg ) std::cout << __FILE__ << ":" << __LINE__ << ": " << msg
#else
#define M_DebugLog( msg )
#endif

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
方法必須始終是完整的,可編譯的代碼; 宏可能是代碼片段。因此,您可以定義一個(gè)foreach宏:
#define foreach(list, index) for(index = 0; index < list.size(); index++)
并因此使用它:
foreach(cookies, i) printf("Cookie: %s", cookies[i]);
從C ++ 11開始,它被基于范圍的for循環(huán)所取代。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
頭文件保護(hù)需要宏。
還有其他需要宏的領(lǐng)域嗎?不多(如果有的話)。
是否有其他情況可以從宏中受益?是?。?!
我使用宏的一個(gè)地方是非常重復(fù)的代碼。例如,當(dāng)包裝C ++代碼以與其他接口(.NET,COM,Python等)一起使用時(shí),我需要捕獲不同類型的異常。我是這樣做的:
#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__); \}
我必須將這些捕獲物放在每個(gè)包裝函數(shù)中。我不是每次都輸入完整的catch塊,而是輸入:
void Foo(){ try { ::mylib::Foo() } HANDLE_EXCEPTIONS}
這也使維護(hù)更容易。如果我必須添加一個(gè)新的異常類型,我只需要添加一個(gè)地方。
還有其他有用的示例:其中許多包括__FILE__
和__LINE__
預(yù)處理器宏。
無論如何,正確使用時(shí),宏非常有用。宏不是邪惡的 - 他們的濫用是邪惡的。
- 3 回答
- 0 關(guān)注
- 542 瀏覽
添加回答
舉報(bào)