2014-03-24 27 views
0

我有一個宏觀DDLogDebug(...),我想做到以下幾點如何在另一個宏中存儲宏?

#define _DDLogDebug(arg...) DDLogDebug(args) 
#undef DDLogDebug 
#define DDLogDebug(args...) doSomething(); _DDLogDebug(arg...) 

但它不工作。取而代之的#define _DDLogDebug(arg...) DDLogDebug(args),我需要一個命令,「專賣店」的宏觀DDLogDebug_DDLogDebug的內容。

  • 有沒有這樣的事情存在?

  • 一個應該如何當一個人想修改宏其定義不暴露呢?

回答

1

你不能用純粹的標準預處理器做這樣的事情。

的原因是,宏定義並不像例如工作在主要語言功能的定義:在那個時候你定義_DDLogDebug,它實際上沒有鏈接到的DDLogDebug的定義 - 它的存儲正是你寫。除非在任何定義之外的程序中使用宏,否則它不會嘗試實際找到任何名稱的擴展。到那時,DDLogDebug的定義已經消失。

這實際上是一種有價值的行爲,因爲它允許使用像X-macros這樣的技術:一個定義可以提供一個框架,並讓不同的調用上下文決定如何以不同的方式實際使用它。外部宏不僅在寫入時不依賴於可用的定義,而且其內容的含義可以在整個程序中改變,而不必改變其結構。

如果不能解決這個問題,你可能有一些運氣的非標可廣泛支持push_macro and pop_macro directives


使用push和pop的例子:通過gcc -E

#define FOO 123 
#pragma push_macro("FOO") 
#undef FOO 
FOO 
#pragma pop_macro("FOO") 
FOO 

運行這一點,你會看到它發出FOO(新行)123。與Clang合作。

+0

你知道,如果這些指令編程的OSX的時候有哪些?看來他們不是。 – Colas

+1

@Colas他們在OSX上爲我工作得很好......看到修改後的答案。 – Leushenko

相關問題