我有兩個大框架庫,其頭文件包含在我的項目中。任何一個都可以完美地工作,但包括兩者都會導致不穩定的行爲(但沒有與宏相關的錯誤消息)。如何識別C中的重新定義的宏?
我假設他們都#定義一個同名的宏。什麼是最有效的方法來識別有問題的宏?
我有兩個大框架庫,其頭文件包含在我的項目中。任何一個都可以完美地工作,但包括兩者都會導致不穩定的行爲(但沒有與宏相關的錯誤消息)。如何識別C中的重新定義的宏?
我假設他們都#定義一個同名的宏。什麼是最有效的方法來識別有問題的宏?
如果頭文件寫得很糟,並且#undef SYMBOL ... #define SYMBOL something-else
那麼你不能跟蹤這個。簡單地說#定義一個宏兩次應該至少發出警告。你必須更仔細地看待'不穩定的行爲'。
謝謝!我沒有想到他們可能使用undef。這使得搜索更容易。 – relet 2010-06-22 12:00:16
grep for #define?
你確定這個問題是不是比宏別的東西(對於structur包裝,全球的內存分配,類名的全局命名空間,帶有語言搞亂例如雜注...)
我承擔他們都#定義一個同名的宏。
這應該會產生至少一個編譯器的警告(如果它們在同一個翻譯單元中)。
如何識別C/C++中的重新定義的宏?
據我所知,沒有直接的方法。
無論是一個完美的作品,但既包括導致不穩定的行爲
能否請您給我們分析一下eratic行爲的一些細節?究竟發生了什麼?是什麼讓你認爲這是宏觀定義?
嘗試查看預處理輸出以確定當您的頭文件和不在時的不同之處。使用gcc和MSVC,你可以編譯-E
將預處理器輸出打印到標準輸出。 (它可能會成千上萬的行,所以你想要管它到一個文件。)
這並確保「警告:重新定義某個或某些東西」未關閉。 – rubenvb 2010-06-22 11:47:48
您應該能夠在您的源代碼上運行ctags
。 ctags
可以生成一個標記文件,其中包含C文件中宏的名稱和位置。
您可以通過使用--c-kinds
選項來控制ctags將存儲在標籤文件中的符號類型。 例如。 ctags --c-kinds=+d -f tags --recurse ./your_source_directory/
然後,您可以在結果標記文件中搜索重複項。
什麼是兩個大型框架庫?你遇到的錯誤究竟是什麼?如果你更準確,你會更有可能得到很好的答案。 – ereOn 2010-06-22 09:51:19
宏是罪魁禍首的前提可能是有缺陷的 - 你應該從更好地描述情況開始。畢竟,有很多方法可以用C和C++來獲得未診斷的未指定或未定義的行爲。但是,那兩個是哪一個呢?沒有C/C++語言。 – 2010-06-22 10:08:09
沒有C/C++語言,但是否有C/C++ _preprocessor_是另一個問題。 – MSalters 2010-06-22 10:55:47