2010-01-22 83 views
7

使用C/C++宏可以很容易地自動生成長結構。例如,如果我想要一個巨大的一套方法不曾經拋出異常(必須爲COM暴露的方法),我可以做這樣的事情:如何使預處理器插入換行符進入宏擴展結果?

#define BEGIN_COM_METHOD\ 
    try{ 

#define END_COM_METHOD\ 
    return S_OK;\ 
    } catch(exception&) {\ 
     // set IErrorInfo here\ 
     return E_FAIL;\ 
    } 

做出這樣的宏管理可以使用「\」字符使宏定義成爲多行並且更具可讀性。

問題是,有時這些構造的代碼不會編譯 - 某些東西不會像預期的那樣擴展,並且編譯器會出現無效的代碼。編譯器通常具有「生成預處理文件」選項以向開發人員顯示預處理結果。但是在預處理文件中,宏被擴展爲一行,結果幾乎不可讀。

是否有可能使預處理器保持宏定義中的換行符?

+1

你已經發現了一個宏不應該被使用的情況之一。混淆的控制流程在這裏特別討厭。 – 2010-01-22 13:05:31

+2

@nobugz是的,但我們目前有16個COM暴露方法,我們需要在每個方法中嘗試捕獲和參數跟蹤,並且這些花哨和哨聲必須可維護。 C++沒有提供其他方式來使用宏進行這種擴展。 – sharptooth 2010-01-25 15:43:23

回答

6

你不能這樣做。替換文本直到它的結尾爲#define d,所以它不會有換行符。如果您的編譯問題不頻繁,您可以在編譯之前通過indent或類似的東西運行預處理的文件,以便恰好幫助您獲得更易讀的代碼。