2010-06-22 72 views
1

我有兩個大框架庫,其頭文件包含在我的項目中。任何一個都可以完美地工作,但包括兩者都會導致不穩定的行爲(但沒有與宏相關的錯誤消息)。如何識別C中的重新定義的宏?

我假設他們都#定義一個同名的宏。什麼是最有效的方法來識別有問題的宏?

+4

什麼是兩個大型框架庫?你遇到的錯誤究竟是什麼?如果你更準確,你會更有可能得到很好的答案。 – ereOn 2010-06-22 09:51:19

+1

宏是罪魁禍首的前提可能是有缺陷的 - 你應該從更好地描述情況開始。畢竟,有很多方法可以用C和C++來獲得未診斷的未指定或未定義的行爲。但是,那兩個是哪一個呢?沒有C/C++語言。 – 2010-06-22 10:08:09

+1

沒有C/C++語言,但是否有C/C++ _preprocessor_是另一個問題。 – MSalters 2010-06-22 10:55:47

回答

3

如果頭文件寫得很糟,並且#undef SYMBOL ... #define SYMBOL something-else那麼你不能跟蹤這個。簡單地說#定義一個宏兩次應該至少發出警告。你必須更仔細地看待'不穩定的行爲'。

+0

謝謝!我沒有想到他們可能使用undef。這使得搜索更容易。 – relet 2010-06-22 12:00:16

1

grep for #define?

你確定這個問題是不是比宏別的東西(對於structur包裝,全球的內存分配,類名的全局命名空間,帶有語言搞亂例如雜注...)

5

我承擔他們都#定義一個同名的宏。

這應該會產生至少一個編譯器的警告(如果它們在同一個翻譯單元中)。

如何識別C/C++中的重新定義的宏?

據我所知,沒有直接的方法。

無論是一個完美的作品,但既包括導致不穩定的行爲

能否請您給我們分析一下eratic行爲的一些細節?究竟發生了什麼?是什麼讓你認爲這是宏觀定義?

3

嘗試查看預處理輸出以確定當您的頭文件和不在時的不同之處。使用gcc和MSVC,你可以編譯-E將預處理器輸出打印到標準輸出。 (它可能會成千上萬的行,所以你想要管它到一個文件。)

+0

這並確保「警告:重新定義某個或某些東西」未關閉。 – rubenvb 2010-06-22 11:47:48

1
  1. 編譯與所有警告 - 他們應該告訴你什麼時候宏'已經定義'(也許你可以修改代碼,以解決這個問題)
  2. 如果(1)沒有幫助,那麼你應該嘗試爲每個庫創建函數包裝器。這樣,您可以通過使用包裝函數來包含包裝的標題來避免包含衝突的標題。這很費力,但它有時是使兩個庫在應用程序中共存的唯一方法。

基本上解決方案(2)會使庫之間分離。當強制使用使用不同選項編譯的預編譯庫(一個庫是另一個ASCII的Unicode)時,此類衝突的一個示例是ACEwxWidgets(2.8版本)。

2

您應該能夠在您的源代碼上運行ctagsctags可以生成一個標記文件,其中包含C文件中宏的名稱和位置。

您可以通過使用--c-kinds選項來控制ctags將存儲在標籤文件中的符號類型。 例如。 ctags --c-kinds=+d -f tags --recurse ./your_source_directory/

然後,您可以在結果標記文件中搜索重複項。