跳到主要內容

關於宏定義的問題

· 閱讀需 2 分鍾

C語言中的宏定義有時候很方便,有時候也有些不便。宏最重要的性質之一就是,它是在編譯的時候直接替換相應的關鍵字,只是簡單的替換。所以用宏定義表達式時需要額外注意。

今天打算寫一個函數庫,然後裡面的函數都是駝峰命名風格(例如funcMyFunction)的,想同時實現Pascal風格(FuncMyFunction)調用。顯然把代碼復制一遍定義新函數是很不明智的,體積增加,代碼大量重復,維護不便等等。

於是我就打算通過定義宏來實現:

namespace A
{
#define TestFunc testFunc
// ......
}

但問題就來了,宏定義是無視命名空間的。

也就是說,雖然是在名空間A中定義的,但它是全局有效的。如果實際項目中包含了這個頭文件,而這個項目又包含了其他庫的頭文件,萬一有相同名稱的函數就會出錯,因為所有文件中的"TestFunc"都會被替換為testFunc,然後出錯。雖然這個概率不大,但其實也不算太小。

想了半天也沒想到完美的解決方案,不過想到兩個規避的方法。

  1. 單獨用一個頭文件定義這些宏,然後在編譯時靈活決定是否包含它(或者在頭文件中設置條件編譯)。
  2. 給庫中的函數加上前綴,比如mylib_funcMyFunc,這樣再定義宏也能很大程度上規避重復,這條可以與第一條同時進行,應該比較保險了。

這個問題意義不是很大,不過想到了也就一說。