2015-06-09 38 views

回答

5

預處理器按順序連接所有包含的源文件。如果你沒有取消定義一個宏,它可以應用於任何來源,在它之後第一次被定義。由於頭文件通常是庫的公共API,因此您在頭文件中定義的任何宏都可能以別人的代碼結尾,出現意想不到的情況。

由於意想不到的事情都是好的軟件的對立面,你應該:

  1. 不使用宏(地道的C++真的不應該)
  2. 定義他們在私人範圍(總是喜歡私人)或
  3. 取消定義他們在使用後立即(雖然這使他們成爲自己的代碼基本上沒用)

最好的解決方案取決於你的使用情況。通常排除包括守衛和其他簡單,安全的定義(類似於函數的宏更可能導致問題,但仍可以像定義TRUE FALSE那樣做一些愚蠢的事情)。

您也可以研究有條件地定義宏,以使它們出現在您的代碼中,但不會成爲公共API的一部分。在構建過程中檢查變量集或將宏保存在單獨的頭文件中允許其他人明確地,明確地包含它們,如果宏有助於避免大量樣板文件,這可能很方便。

+0

什麼是在我們的代碼中有條件地包含宏的好例子,它不會成爲公共API的一部分? –

+0

你可以像使用ifdef FOO_MACROS守衛一樣簡單地使用標題中的宏,然後將其定義爲構建的一部分。否則,把它們放在你的源文件(但不是你的公共頭文件)包含的標題中,允許你訪問但不分發它們。 – ssube

1

出於與使用語句不應該在頭文件中相同的原因:命名空間污染。如果你想在一個頭文件中使用宏,確保你在頭的末尾取消定義它們,這樣它們將不會被錯誤地包含。如果您只是想在頭文件中定義它們並在cpp文件中使用它們,請確保「macros.h」從未包含在任何頭文件中。 (a)和(b)擴展到(a)+(b)。例如,你可能不希望或期望例如總和(a,b)擴展到(a)+(b)。尋找自己宏觀錯誤的根源可能是一場噩夢,找到別人幾乎是不可能的。

相關問題